(七)自动化测试之selenium学习心得-实战技巧
一、Selenium 提供的 ActionChains 类 实现鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等应用场景
我们以移动鼠标到某个元素为例。鼠标移动到百度页面【设置】上显示下拉列表

代码如下:
from selenium import webdriver
# 导入ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('https://www.baidu.com/')
# 使用 ActionChains 来 模拟鼠标移动到设置,下拉列表显示的操作
ac = ActionChains(wd)
ac.move_to_element(wd.find_element_by_id('s-usersetting-top')).perform()
二、冻结界面
有些网站上面的元素, 我们鼠标放在上面,会动态弹出一些内容。
鼠标一移走后又消失,无法定位到元素属性,我们可以这么办哦
在 开发者工具栏 console 里面执行如下js代码
setTimeout(function(){debugger}, 5000)
这句代码什么意思呢?
表示在 5000毫秒后,执行 debugger 命令
执行该命令会 浏览器会进入debug状态。 debug状态有个特性, 界面被冻住, 不管我们怎么点击界面都不会触发事件。
所以,我们可以在输入上面代码并回车 执行后, 立即 鼠标放在我们需要的动态内容上面。
然后,我们仔细等待 5秒 到了以后, 界面就会因为执行了 debugger 命令而被冻住。
如下图所示:
然后,我们就可以点击 开发者工具栏的 查看箭头, 再去 点击 我们需要的内容 ,查看其属性了。

三、弹出对话框
3.1、Alert
Alert 弹出框,目的就是显示通知信息,只需用户看完信息后,点击 OK(确定) 就可以了。
那么,自动化的时候,代码怎么模拟用户点击 OK 按钮呢?
selenium提供如下方法进行操作
driver.switch_to.alert.accept()
注意:如果我们不去点击它,页面的其它元素是不能操作的。 {: .notice–info}
如果程序要获取弹出对话框中的信息内容, 可以通过 如下代码
driver.switch_to.alert.text
代码例子如下:
from selenium import webdriver
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('http://cdn1.python3.vip/files/selenium/test4.html')
# alert对话框选中,点击一下
wd.find_element_by_id('b1').click()
# 打印出弹框上的提示信息
print(wd.switch_to.alert.text)
# 点击OK按钮,关闭弹框
wd.switch_to.alert.accept()
3.2、Confirm
Confirm弹出框,主要是让用户确认是否要进行某个操作。
比如:当管理员在网站上选择删除某个账号时,就可能会弹出 Confirm弹出框, 要求确认是否确定要删除。
Confirm弹出框 有两个选择供用户选择,分别是 OK 和 Cancel, 分别代表 确定 和 取消 操作。
那么,自动化的时候,代码怎么模拟用户点击 OK 或者 Cancel 按钮呢?
selenium提供如下方法进行操作
如果我们想点击 OK 按钮, 还是用刚才的 accept方法,如下
driver.switch_to.alert.accept()
如果我们想点击 Cancel 按钮, 可以用 dismiss方法,如下
driver.switch_to.alert.dismiss()
代码例子如下:
from selenium import webdriver
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('http://cdn1.python3.vip/files/selenium/test4.html')
# alert对话框选中,点击一下
wd.find_element_by_id('b2').click()
# 打印出弹框上的提示信息
print(wd.switch_to.alert.text)
# 点击OK按钮,关闭弹框
wd.switch_to.alert.dismiss()
3.3、Prompt
出现 Prompt 弹出框 是需要用户输入一些信息,提交上去。
比如:当管理员在网站上选择给某个账号延期时,就可能会弹出 Prompt 弹出框, 要求输入延期多长时间。
可以调用如下方法
driver.switch_to.alert.send_keys()
代码例子如下:
from selenium import webdriver
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('http://cdn1.python3.vip/files/selenium/test4.html')
# prompt对话框选中,点击一下
wd.find_element_by_id('b3').click()
# 获取弹框对象
alt = wd.switch_to.alert
# 打印出弹框上的提示信息
print(alt.text)
# 输入信息,点击OK按钮,提交信息
alt.send_keys('我们一起学selenium')
alt.accept()
# 点击取消按钮
wd.find_element_by_id('b3').click()
alt = wd.switch_to.alert
alt.dismiss()
注意 : 有些弹窗并非浏览器的alert 窗口,而是html元素,这种对话框,只需要通过之前介绍的选择器选中并进行相应的操作就可以了。
四、其他技巧
下面是一些其他的 Selenium 自动化技巧
窗口大小
有时间我们需要获取窗口的属性和相应的信息,并对窗口进行控制
获取窗口大小
driver.get_window_size()
改变窗口大小
driver.set_window_size(x, y)
获取当前窗口标题
浏览网页的时候,我们的窗口标题是不断变化的,可以使用WebDriver的title属性来获取当前窗口的标题栏字符串。
driver.title
获取当前窗口URL地址
driver.current_url
例如,访问网易,并获取当前窗口的标题和URL
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 打开网站
driver.get('https://www.163.com')
# 获取网站标题栏文本
print(driver.title)
# 获取网站地址栏文本
print(driver.current_url)
截屏
有的时候,我们需要把浏览器屏幕内容保存为图片文件。
比如,做自动化测试时,一个测试用例检查点发现错误,我们可以截屏为文件,以便测试结束时进行人工核查。
可以使用 WebDriver 的 get_screenshot_as_file方法来截屏并保存为图片。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 打开网站
driver.get('https://www.baidu.com/')
# 截屏保存为图片文件
driver.get_screenshot_as_file('1.png')
手机模式
我们可以通过 desired_capabilities 参数,指定以手机模式打开chrome浏览器
参考代码,如下
from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())
driver.get('http://www.baidu.com')
input()
driver.quit()
上传文件
有时候,网站操作需要上传文件。
比如,著名的在线图片压缩网站: https://tinypng.com/
通常,网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的。
如下所示:
<input type="file" multiple="multiple">
使用selenium自动化上传文件,我们只需要定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可。
如下所示:
# 先定位到上传文件的 input 元素
ele = wd.find_element_by_css_selector('input[type=file]')
# 再调用 WebElement 对象的 send_keys 方法
ele.send_keys(r'h:\g02.png')
如果需要上传多个文件,可以多次调用send_keys,如下
ele = wd.find_element_by_css_selector('input[type=file]')
ele.send_keys(r'h:\g01.png')
ele.send_keys(r'h:\g02.png')
但是,有的网页上传,是没有 file 类型 的 input 元素的。
如果是Windows上的自动化,可以采用 Windows 平台专用的方法:
执行
pip install pypiwin32
确保 pywin32 已经安装,然后参考如下示例代码
# 找到点击上传的元素,点击
driver.find_element_by_css_selector('.dropzone').click()
sleep(2) # 等待上传选择文件对话框打开
# 直接发送键盘消息给 当前应用程序,
# 前提是浏览器必须是当前应用
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
# 输入文件路径,最后的'\n',表示回车确定,也可能时 '\r' 或者 '\r\n'
shell.Sendkeys(r"h:\a2.png" + '\n')
sleep(1)
自动化Edge浏览器
点击这里,边看视频讲解,边学习下面的内容
自动化基于Chromium内核的 微软最新Edge浏览器,首先需要查看Edge的版本。
点击菜单 帮助和反馈 > 关于Microsoft Edge ,在弹出界面中,查看到版本,比如
版本 79.0.309.71 (官方内部版本) (64 位)
然后 点击这里,打开Edge浏览器驱动下载网页 ,并选择下载对应版本的驱动。
在自动化代码中,指定使用Edge Webdriver类,并且指定 Edge 驱动路径,如下所示
from selenium import webdriver
driver = webdriver.Edge(r'd:\tools\webdrivers\msedgedriver.exe')
driver.get('http://www.51job.com')
自动化Electron程序
Electron程序都是基于基于Chromium技术开发的,所以基本也可以用Chromedriver驱动自动化。
要自动化,首先需要得到内置 Chromium的版本号。
向开发人员查询打开 Dev Tools 窗口的快捷键(通常是ctrl + Shift + I),打开Dev Tools 窗口后, 在 Console tab中输入 如下语句,查看版本
> navigator.appVersion.match(/.*Chrome\/([0-9\.]+)/)[1]
"79.0.3945.130"
然后去 chromedriver下载网址 ,下载对应版本的驱动。
在自动化程序中需要指定打开的可执行程序为Electron程序,而不是 Chrome浏览器。
如下所示
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
ops = Options()
# 指定Electron程序路径
ops.binary_location = r"C:\electronAPP.exe"
driver = webdriver.Chrome(r"e:\chromedriver.exe",
options = ops)

浙公网安备 33010602011771号