在了解webdriver常用的API之前,先来了解一下webdriver的工作流程:
由上图我们可以看出,当用户操作相应的浏览器时,webdriver会通过浏览器的原生组件,转化Web Service的命令为浏览器的native的调用来完成操作;脚本运行后,会打开指定浏览器,webdriver会将目标浏览器绑定到指定的端口,这样,启动后的浏览器就会接受脚本的命令。
- webdriver提供的八种元素定位的方法:
- id
- name
- class_name
- tag_name
- xpath
- css_selector
- link_text
- partial_link_text
以百度为例,使用这八种定位元素的方法:
首先,打开百度首页,获取到百度搜索框的描述元素的语句,示例如下:
接下来就可以定位元素了:
#coding=utf-8
from selenium import webdriver
import time
#打开指定的浏览器
browser=webdriver.Chrome()
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
#在百度搜索框中输入"readinig"并搜索
#browser.find_element_by_id("kw").send_keys("reading")
#browser.find_element_by_name("wd").send_keys("reading")
#browser.find_element_by_class_name("s_ipt").send_keys("reading")
#browser.find_element_by_tag_name("input").send_keys("reading")不可执行 因为input太多
#browser.find_element_by_xpath("//*[@id='kw']").send_keys("reading")
#browser.find_element_by_css_selector("#kw").send_keys("reading")
#在百度浏览器中找到"hao123"并打开此网页
#browser.find_element_by_link_text("hao123").click()
#browser.find_element_by_partial_link_text("hao").click()
time.sleep(3)
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
- 常用的函数:
- find_element_by_元素定位方法(“对应元素名称”) --> 定位元素
- send_keys(“内容”) --> 模拟键盘手动输入内容
- clear() --> 清除当前内容
- quit() --> 退出所有窗口,退出webdriver,会更好的释放资源
- close() --> 关闭当前的浏览器窗口
- click() --> 点击
- submit() --> 提交内容
- sleep(单位:s) --> 添加休眠
- implicitly_wait(单位:s) --> 智能等待
- 常见获取信息的关键字:
- text --> 打印元素文本信息
#coding=utf-8
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(3)
txt=browser.find_element_by_id("cp").text
print txt
time.sleep(3)
browser.quit()
执行结果:
2) title --> 打印元素标题信息
3) current_url --> 打印当前路径
#coding=utf-8
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("http://www.baidu.com")
print browser.title
print browser.current_url
browser.quit()
结果如下:
4. 浏览器的常用操作:
- 浏览器最大化 --> maximize_window()
- 设置浏览器大小 --> set_window_size(宽,高)
- 浏览器的前进/后退 --> forward()/back()
- 控制浏览器滚动条:实际上是采用了js语句,然后在当前窗口同步执行JS语句 --> execute_script(js)
这是一个简单的进入百度页面,搜索相关事件,完成浏览器的前进,后退以及其他操作,使用time.sleep()可以清楚地观察到每一步的执行:
#coding=utf-8
from selenium import webdriver
import time
driver=webdriver.Chrome()
#设置窗口大小
driver.set_window_size(480,800)
driver.get("http://www.baidu.com")
#窗口最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(2)
driver.find_element_by_id("su").click()
time.sleep(2)
#后退到百度首页
driver.back()
time.sleep(2)
#前进到刚才的selenium搜索页面
driver.forward()
time.sleep(2)
#将页面滚动到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(2)
#滚动到顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep(2)
driver.quit()
- 键盘事件:
键盘按键用法:首先需要导入Keys包 --> from selenium.webdriver.common.keys import Keys
- 使用TAB键以及ENTER键:send_keys(Keys.TAB/EM=ENTER)
- 使用复合键(复制/粘贴/全选/剪切):send_keys(Keys.CONTROL,‘c’/‘v’/‘a’/‘x’)
- 鼠标事件:
鼠标事件用法:首先需要导入ActionChains包 --> from selenium.webdriver.common.action_chains import ActionChains
- 右击:context_click()
- 双击:double_click()
- 拖动:drag_and_drop(source,target)
- 鼠标悬停在一个元素上:move_to_element()
#coding=utf-8
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
d=webdriver.Chrome()
d.get("http://www.baidu.com")
d.find_element_by_id("kw").send_keys("yuanlin")
time.sleep(3)
qqq=d.find_element_by_xpath("//*[@id='su']")
#右击
ActionChains(d).context_click(qqq).perform()
time.sleep(3)
#双击
ActionChains(d).double_click(qqq).perform()
time.sleep(3)
#给出要悬停的位置(我这里找的是搜索园林之后的"园林图片"这个标题)
target=d.find_element_by_xpath("//*[@id='2']/h3/a")
#鼠标找到目标位置并悬停
ActionChains(d).move_to_element(target)
time.sleep(3)
#点击
target.click()
time.sleep(3)
d.quit()
- 定位一组元素:
- 获取当前文件的绝对路径:os.path.abspath(‘文件名’)
- 选择页面上所有的同名的属性
- 通过for循环还有get_attribute(‘属性名称’)获得属性值,选择自己想要勾选的相关数据即可
先来看一下我们的html文件所生成的页面:
如果我们要勾选多个复选框,首先要观察他们的描述的异同点:
可以发现,它们的tag_name都是"input",但是类型是checkbox,与radio不同。
故代码实现如下:
#coding=utf-8
from selenium import webdriver
import time
import os
driver=webdriver.Chrome()
#获取当前文件的绝对路径
file_path=os.path.abspath('checkbox.html')
driver.get(file_path)
time.sleep(3)
#定位到多个元素
inputs=driver.find_elements_by_tag_name("input")
for input in inputs:
#筛选出我们所要的多个元素
if input.get_attribute('type')=='checkbox':
input.click()
time.sleep(3)
driver.quit()
结果如下: