1. 打开和关闭浏览器
引入 webdriver API
from selenium import webdriver
在所有的对浏览器操作之前都要先获取浏览器驱动
# 获取 Chrome 浏览器驱动 driver = webdriver.Chrome()
1)打开浏览器并访问 URL
打开浏览器访问百度主页
driver.get("https://www.baidu.com/")
2)关闭浏览器窗口
下面两种方法都可以实现关闭浏览器的操作
但 close 方法仅仅关闭当前聚焦的浏览器窗口,quit 方法关闭所有浏览器窗口,并清除浏览器缓存
driver.quit() driver.close()
2. 元素的定位
元素的定位是自动化测试的核心,要操作一个元素,首先就要先定位到该元素
webdriver 中提供了一系列使用元素不同属性定位元素的方法:
id
name
tag name
class name
xpath
link text
partial link text
css selector
在网页源代码中找到对应的属性值,就可以定位该元素
注:不管用哪种方法,都要保证在当前页面上该属性值是唯一的
1)以 id 定位元素
定位 id 属性值为 kw 的元素
driver.find_element_by_id("kw")
2)以 name 定位元素
定位 name 属性值为 wd 的元素
driver.find_element_by_name("wd")
3)以 tag name 定位元素
定位标签名为 input 的元素
driver.find_element_by_tag_name("input")
4)以 class name 定位元素
定位 class name 属性值为 s_ipt 的元素
driver.find_element_by_class_name("s_ipt") • 1
5)以 xpath 定位元素
在浏览器 控制台中找到要定位的元素,右键 选择 复制 XPath 来获取对应元素的 XPath 属性值
定位 xpath 属性值为 //*[@id=‘kw’] 的元素
driver.find_element_by_xpath("//*[@id='kw']")
6)以 css selector 定位元素
css selector 属性值的获取方式同 xpath 属性值的获取方式一样,点击 复制 selector 即可获取
定位 css selector 属性值为 #kw 的元素
driver.find_element_by_css_selector("#kw")
7)以 link text 定位元素
这种方式用来定位带有链接的文字,link text 属性值就是文字内容
driver.find_element_by_link_text("贴吧")
8)以 partial link text 定位元素
这种方式也是定位带有链接的文字,不过不同于上一种方法的是,这里的属性值可以是页面上具体文字链接内容的一部分
driver.find_element_by_partial_link_text("贴")
3. 操作测试元素
前面说了常用的定位元素的方法,定位只是第一步,定位之后需要对元素进行操作以完成测试
webdriver 中常用的操作元素的方法有:
click: 点击元素
send_keys: 模拟键盘在元素中输入内容
clear: 清空元素内容
submit: 提交
text: 得到元素内的文本信息
1)键盘输入与鼠标点击
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com/") # 在百度搜索框中输入 python driver.find_element_by_id("kw").send_keys("python") # 点击搜索按钮 driver.find_element_by_id("su").click() # 清空搜索框内容 driver.find_element_by_id("kw").clear
2)submit 提交表单
submit 只能在元素属性中 type=“sumit” 时使用,此时使用 submit 实现的效果和 click 点击相同
driver.find_element_by_id("kw").submit() • 1
3)获取元素内容
使用 text 可以获取到已经定位的元素内所有的文本信息
text = driver.find_element_by_class_name("c-container").text print(text)
4. 添加等待
等待是一个非常重要的事,由于网络延迟的问题,有时候页面还未加载出来时,但是代码已经执行到下一步,下一步的代码要定位的元素还未被浏览器加载出来,就无法定位导致出错,此时就需要添加等待来等待浏览器将页面加载出来再进行定位
添加等待还可以让我们更直观的看到浏览器执行的每一步
1)sleep 休眠
引入 time 包,在指定休眠时间即可
import time time.sleep(3)
2)智能等待
通过 webdriver 下的 implicitly_wait() 方法就可以实现智能等待
智能等待 是指程序会在一个时间范围内等待,当脚本执行到某个元素的定位时,如果可以定位则等待结束,如果不能定位,则会继续等待,直到等待时间超过设置的最大等待时间
driver.implicitly_wait(3) # 最大等待时间 3s
5. 打印网页 title 和 URL
# 打印当前网页 URL print(driver.current_url) # 打印当前网页 title,即在 html 源码中 title 标签中的文字信息 print(driver.title)
6. 浏览器操作
1)设置浏览器窗口的宽和高
# 设置浏览器宽 400,高 1000 driver.set_window_size(400, 1000)
2)设置浏览器窗口最大化
driver.maximize_window()
3)浏览器页面的前进和后退
每个浏览器都会有前进和后退按钮,来操作浏览器返回下一个或上一个页面
# 后退,返回上一个页面 driver.back() # 前进,返回下一个页面 driver.forward()
4)控制浏览器滚动条
浏览器滚动条的控制需要依靠 js 脚本
# 把滚动条拉到最底端 js1 = "var q=document.documentElement.scrollTop=10000" driver.execute_script(js1) # 把滚动条拉到最顶端 js2 = "var q=document.documentElement.scrollTop=0" driver.execute_script(js2)
7. 键盘操作
要使用键盘操作,必须引入 Keys 包
键盘操作的按键通过 send_keys 调用,必须要先定位元素再操作
from selenium.webdriver.common.keys import Keys
1)键盘按键
# TAB 键 driver.find_element_by_id("user_login").send_keys(Keys.TAB) # ENTER 键 driver.find_element_by_id("user_password").send_keys(Keys.ENTER) # 空格键 driver.find_element_by_id("user_login").send_keys(Keys.SPACE) # ESC 键 driver.find_element_by_id("user_login").send_keys(Keys.ESCPACE)
2)组合键盘按键
# Ctrl + a,全选 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "a") # Ctrl + x,剪切 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "x") # Ctrl + c,复制 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "c") # Ctrl + v,粘贴 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "v")
8. 鼠标事件
要使用鼠标操作,需要引入 ActionChains 包
同样的,需要先定位元素再进行操作
from selenium.webdriver.common.action_chains import ActionChains # 鼠标双击 b = driver.find_element_by_id("su") ActionChains(driver).double_click(b).perform() # 鼠标右键 a = driver.find_element_by_id("kw") ActionChains(driver).context_click(a).perform() # 拖动鼠标到指定位置 a = driver.find_element_by_xpath("//*[@id='s-top-left']/div/a") # 定位移动后的位置 ActionChains(driver).move_to_element(a).perform()
9. 定位一组元素
1)如何打开本地 HTML 页面
本地 HTML 页面打开时,在浏览器的 URL 显示为 “file:///” + 文件的绝对路径,所以我们需要拼接以下再进行打开
引入 os 包,使用 os.path.abspath(文件绝对路径) 来指定一个绝对路径,再使用字符串拼接的方法将前缀 “file:///” 加上,就得到了我们想要的URL
2)定位一组 checkbox
有如下 HTML 代码,需从中定位所有 checkbox 类型的 input,并全部勾选
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>Checkbox</title> </head> <body> <h3>checkbox</h3> <div class="well"> <form class="form-horizontal"> <div class="control-group"> <label class="control-label" for="c1">checkbox1</label> <div class="controls"> <input type="checkbox" id="c1" /> </div> </div> <div class="control-group"> <label class="control-label" for="c2">checkbox2</label> <div class="controls"> <input type="checkbox" id="c2" /> </div> </div> <div class="control-group"> <label class="control-label" for="c3">checkbox3</label> <div class="controls"> <input type="checkbox" id="c3" /> </div> </div> <div class="control-group"> <label class="control-label" for="r">radio</label> <div class="controls"> <input type="radio" id="r1" /> </div> </div> <div class="control-group"> <label class="control-label" for="r">radio</label> <div class="controls"> <input type="radio" id="r2" /> </div> </div> </form> </div> </body> </html>
自动化脚本如下:
import os import time from selenium import webdriver # 获取浏览器驱动 driver = webdriver.Chrome() # 拼接 URL url = "file:///" + os.path.abspath("D:\\JAVA\\Python\\project\\selenium\\test2.html") # 打开 HTML 页面 driver.get(url) # 定位所有的 input 标签,得到的结果是一个 list elements = driver.find_elements_by_tag_name("input") for element in elements: # 在 list 中筛选 checkbox 并勾选 # get_attribute 得到元素的某一个属性值 if element.get_attribute("type") == "checkbox": element.click() time.sleep(1) time.sleep(3) driver.quit()
10. 多层框架/窗口定位
在 HTML 页面的设计中,常常会有框架的嵌套,或者在操作浏览器时常常会出现多个窗口,此时若可以定位到某个具体的框架或者窗口,再去定位元素就会简单许多
1)多层框架定位
webdriver 中提供了下面两种方法来对框架进行定位
# 定位到当前页面内嵌套的某个框架 driver.switch_to.frame(frameName) # 从嵌套中跳出,跳回最外面的默认页面 driver.switch_to.default_content()
注意:
在框架之间进行跳转时,只能从当前页面跳转到当前页面内嵌套的页面
如上图的框架嵌套:
default 可以跳转到 f1,不能到 f2
f1 可以到 f2,f2 不能到 f1
2)多窗口定位
webdriver 中针对窗口的方法是:switch_to.window
用法以 switch_to.frame 相同
11. alert 弹框的处理
webdriver 中提供了如下方法对 alert 弹框进行定位:
switch_to.alert: 定位到弹框
定位到弹框之后再使用如下方法对 alert 弹框进行处理:
accept: 点击确认按钮
dismiss: 点击取消按钮,如果有的话
send_keys: 向弹框中的输入框输入值,如果没有输入框就不可用
text: 获取弹框中的文字信息