2023年11月25日发(作者:)

(七)⾃动化测试之selenium学习⼼得-实战技巧

⼀、Selenium 提供的 实现⿏标右键点击、双击、移动⿏标到某个元素、⿏标拖拽等应⽤场景

ActionChains

我们以移动⿏标到某个元素为例。⿏标移动到百度页⾯【设置】上显⽰下拉列表

代码如下:

from selenium import webdriver

# 导⼊ActionChains

from _chains import ActionChains

wd = ()

itly_wait(10)

('/')

# 使⽤ ActionChains 模拟⿏标移动到设置,下拉列表显⽰的操作

ac = ActionChains(wd)

_to_element(_element_by_id('s-usersetting-top')).perform()

⼆、冻结界⾯

有些⽹站上⾯的元素, 我们⿏标放在上⾯,会动态弹出⼀些内容。

⿏标⼀移⾛后⼜消失,⽆法定位到元素属性,我们可以这么办哦

开发者⼯具栏 console ⾥⾯执⾏如下js代码

setTimeout(function(){debugger}, 5000)

这句代码什么意思呢?

表⽰在 5000毫秒后,执⾏ debugger 命令

执⾏该命令会 浏览器会进⼊debug状态。 debug状态有个特性, 界⾯被冻住, 不管我们怎么点击界⾯都不会触发事件。

所以,我们可以在输⼊上⾯代码并回车 执⾏后, ⽴即 ⿏标放在我们需要的动态内容上⾯。

然后,我们仔细等待 5 到了以后, 界⾯就会因为执⾏了 debugger 命令⽽被冻住。

如下图所⽰:

然后,我们就可以点击 开发者⼯具栏的 查看箭头, 再去 点击 我们需要的内容 ,查看其属性了。

三、弹出对话框

3.1Alert

Alert 弹出框,⽬的就是显⽰通知信息,只需⽤户看完信息后,点击 OK(确定) 就可以了。

那么,⾃动化的时候,代码怎么模拟⽤户点击 OK 按钮呢?

selenium提供如下⽅法进⾏操作

_()

注意:如果我们不去点击它,页⾯的其它元素是不能操作的。 {: .notice–info}

如果程序要获取弹出对话框中的信息内容, 可以通过 如下代码

_

代码例⼦如下:

from selenium import webdriver

wd = ()

itly_wait(10)

('/files/selenium/')

# alert对话框选中,点击⼀下

_element_by_id('b1').click()

# 打印出弹框上的提⽰信息

print(_)

# 点击OK按钮,关闭弹框

_()

3.2Confirm

Confirm弹出框,主要是让⽤户确认是否要进⾏某个操作。

⽐如:当管理员在⽹站上选择删除某个账号时,就可能会弹出 Confirm弹出框, 要求确认是否确定要删除。

Confirm弹出框 有两个选择供⽤户选择,分别是 OK Cancel 分别代表 确定 取消 操作。

那么,⾃动化的时候,代码怎么模拟⽤户点击 OK 或者 Cancel 按钮呢?

selenium提供如下⽅法进⾏操作

如果我们想点击 OK 按钮, 还是⽤刚才的 accept⽅法,如下

_()

如果我们想点击 Cancel 按钮, 可以⽤ dismiss⽅法,如下

_s()

代码例⼦如下:

from selenium import webdriver

wd = ()

itly_wait(10)

('/files/selenium/')

# alert对话框选中,点击⼀下

_element_by_id('b2').click()

# 打印出弹框上的提⽰信息

print(_)

# 点击OK按钮,关闭弹框

_s()

3.3Prompt

出现 Prompt 弹出框 是需要⽤户输⼊⼀些信息,提交上去。

⽐如:当管理员在⽹站上选择给某个账号延期时,就可能会弹出 Prompt 弹出框, 要求输⼊延期多长时间。

可以调⽤如下⽅法

__keys()

代码例⼦如下:

from selenium import webdriver

wd = ()

itly_wait(10)

('/files/selenium/')

# prompt对话框选中,点击⼀下

_element_by_id('b3').click()

# 获取弹框对象

alt = _

# 打印出弹框上的提⽰信息

print()

# 输⼊信息,点击OK按钮,提交信息

_keys('我们⼀起学selenium')

()

# 点击取消按钮

_element_by_id('b3').click()

alt = _

s()

注意 有些弹窗并⾮浏览器的alert 窗⼝,⽽是html元素,这种对话框,只需要通过之前介绍的选择器选中并进⾏相应的操作就可以了。

四、其他技巧

下⾯是⼀些其他的 Selenium ⾃动化技巧

窗⼝⼤⼩

有时间我们需要获取窗⼝的属性和相应的信息,并对窗⼝进⾏控制

获取窗⼝⼤⼩

_window_size()

⽐如,做⾃动化测试时,⼀个测试⽤例检查点发现错误,我们可以截屏为⽂件,以便测试结束时进⾏⼈⼯核查。

可以使⽤ WebDriver get_screenshot_as_file⽅法来截屏并保存为图⽚。

from selenium import webdriver

driver = ()

itly_wait(5)

# 打开⽹站

('/')

# 截屏保存为图⽚⽂件

_screenshot_as_file('')

⼿机模式

我们可以通过 desired_capabilities 参数,指定以⼿机模式打开chrome浏览器

参考代码,如下

from selenium import webdriver

mobile_emulation = { "deviceName": "Nexus 5" }

chrome_options = Options()

chrome__experimental_option("mobileEmulation", mobile_emulation)

driver = ( desired_capabilities = chrome__capabilities())

('')

input()

()

上传⽂件

有时候,⽹站操作需要上传⽂件。

通常,⽹站页⾯上传⽂件的功能,是通过 type 属性 file HTML input 元素实现的。

如下所⽰:

使⽤selenium⾃动化上传⽂件,我们只需要定位到该input元素,然后通过 send_keys ⽅法传⼊要上传的⽂件路径即可。

如下所⽰:

# 先定位到上传⽂件的 input 元素

ele = _element_by_css_selector('input[type=file]')

# 再调⽤ WebElement 对象的 send_keys ⽅法

_keys(r'h:')

如果需要上传多个⽂件,可以多次调⽤send_keys,如下

ele = _element_by_css_selector('input[type=file]')

_keys(r'h:')

_keys(r'h:')

但是,有的⽹页上传,是没有 file 类型 input 元素的。

如果是Windows上的⾃动化,可以采⽤ Windows 平台专⽤的⽅法:

执⾏

pip install pypiwin32

确保 pywin32 已经安装,然后参考如下⽰例代码

# 找到点击上传的元素,点击

_element_by_css_selector('.dropzone').click()

sleep(2) # 等待上传选择⽂件对话框打开

# 直接发送键盘消息给 当前应⽤程序,

# 前提是浏览器必须是当前应⽤

import

shell = ch("")

# 输⼊⽂件路径,最后的'n',表⽰回车确定,也可能时 'r' 或者 'rn'

ys(r"h:" + 'n')

sleep(1)

⾃动化Edge浏览器

点击这⾥,边看视频讲解,边学习下⾯的内容

⾃动化基于Chromium内核的 微软最新Edge浏览器,⾸先需要查看Edge的版本。

点击菜单 帮助和反馈 > 关于Microsoft Edge ,在弹出界⾯中,查看到版本,⽐如

版本 79.0.309.71 (官⽅内部版本) (64 )

然后 点击这⾥,打开Edge浏览器驱动下载⽹页 ,并选择下载对应版本的驱动。

在⾃动化代码中,指定使⽤Edge Webdriver类,并且指定 Edge 驱动路径,如下所⽰

from selenium import webdriver

driver = (r'd:')

('')

⾃动化Electron程序

Electron程序都是基于基于Chromium技术开发的,所以基本也可以⽤Chromedriver驱动⾃动化。

要⾃动化,⾸先需要得到内置 Chromium的版本号。

向开发⼈员查询打开 Dev Tools 窗⼝的快捷键(通常是ctrl + Shift + I),打开Dev Tools 窗⼝后, Console tab中输⼊ 如下语句,查看版

> (/.*Chrome([0-9.]+)/)[1]

"79.0.3945.130"

然后去 chromedriver下载⽹址 ,下载对应版本的驱动。

在⾃动化程序中需要指定打开的可执⾏程序为Electron程序,⽽不是 Chrome浏览器。

如下所⽰

from selenium import webdriver

from s import Options

ops = Options()

# 指定Electron程序路径

_location = r"C:"

driver = (r"e:",

options = ops)