参考:https://cloud.tencent.com/developer/article/1722974

selenium介绍

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

中文参考文档:https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/

环境准备

selenium 安装

1
pip install selenium -i https://mirrors.aliyun.com/pypi/simple/

chrome driver下载

最新版本地址:https://googlechromelabs.github.io/chrome-for-testing/

历史版本地址:https://sites.google.com/chromium.org/driver/downloads

  1. 首先查看chrome浏览器版本:(浏览器设置 -> 关于chrome)
  1. 下载对应版本后,解压并运行exe程序即可。默认启动端口9515

使用

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from selenium import webdriver
from time import sleep

# 实例化一款浏览器
bor = webdriver.Chrome(executable_path='chromedriver.exe')

# 对指定的url发起请求
bor.get('https://www.jd.com/')
sleep(1)
# 进行标签定位
search_input = bor.find_element_by_id('key')

# 向搜索框中录入关键词
search_input.send_keys("mac pro")

# 点击搜索按钮
btn = bor.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btn.click()
sleep(2)

# 执行js,让滚轮向下滚动
bor.execute_script('window.scrollTo(0, document.body.scrollHeight)')
sleep(2)

page_text = bor.page_source

print(page_text)

bor.quit()

浏览器创建

Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。

1
2
3
4
5
6
7
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

元素定位

webdriver 提供了一系列的元素定位方法,常用的有以下几种:

定位一个元素定位多个元素含义
find_element_by_idfind_elements_by_id通过元素id定位
find_element_by_namefind_elements_by_name通过元素name定位
find_element_by_xpathfind_elements_by_xpath通过xpath表达式定位
find_element_by_link_textfind_elements_by_link_tex通过完整超链接定位
find_element_by_partial_link_textfind_elements_by_partial_link_text通过部分链接定位
find_element_by_tag_namefind_elements_by_tag_name通过标签定位
find_element_by_class_namefind_elements_by_class_name通过类名进行定位
find_elements_by_css_selectorfind_elements_by_css_selector通过css选择器进行定位

注意:

1、find_element_by_xxx找的是第一个符合条件的标签,find_elements_by_xxx找的是所有符合条件的标签。

2、根据ID、CSS选择器和XPath获取,它们返回的结果完全一致。

3、另外,Selenium还提供了通用方法find_element(),它需要传入两个参数:查找方式By和值。实际上,它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID, id),二者得到的结果完全一致。

实例演示

假如有一个web页面,通过前端工具查看到一个元素的属性是这样的。

1
2
3
4
5
6
7
8
<html>
<head>
<body link="#0000cc">
<a href="/" rel="external nofollow" onmousedown="return c({'fm':'tab','tab':'logo'})"/>
<form name="f" action="/s">
<span> </span>
<input name="wd" value="" maxlength="255" autocomplete="off"/>
...

通过id定位:

1
dr.find_element_by_id("kw")

通过name定位:

1
dr.find_element_by_name("wd")

通过class name定位:

1
dr.find_element_by_class_name("s_ipt")

通过tag name定位:

1
dr.find_element_by_tag_name("input")

通过Xpath定位:

当使用 Selenium 进行自动化测试时,XPath 是一种非常有用的工具,它可以帮助我们在 HTML 或 XML 文档中找到特定的元素或节点。XPath 使用路径表达式来选择节点或元素,类似于文件系统中的路径,以下是些常用的写法

1
2
3
4
5
6
7
dr.find_element_by_xpath("//*[@]")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@]")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@]/input")
dr.find_element_by_xpath("//form[@]/span/input")
dr.find_element_by_xpath("//input[@ and @name='wd']")

常规情况下,我们可以通过浏览器的开发者工具,进行Copy Xpath,但我们还需要学习下它其他的编写语法

选取元素

使用元素名称来选取元素,例如:

1
2
//div    # 选取所有 <div> 元素
//input # 选取所有 <input> 元素

选取属性

使用 @ 符号来选取元素的属性,例如:

1
2
3
//input[@name='username']   # 选取 name 属性为 'username' 的 <input> 元素
//a[@href='#'] # 选取 href 属性为 '#' 的 <a> 元素
//div[@class='am-list-content'] # 选取 class 属性为 'am-list-content' 的 <div> 元素

选取子元素

使用 / 符号来选取元素的子元素,例如:

1
2
//div/p    # 选取所有 <div> 元素的子元素 <p>
//ul/li # 选取所有 <ul> 元素的子元素 <li>

选取父元素

使用 .. 来选取元素的父元素,例如:

1
2
3
//input[@name='username']/..

# 选取 name 属性为 'username' 的 <input> 元素的父元素

选取文本内容

使用 text() 来选取元素的文本内容,例如:

1
2
3
//h1/text()   # 选取所有 <h1> 元素的文本内容
//p/text() # 选取所有 <p> 元素的文本内容
//div[text()='登录'] # 选取 标示文字为 '登录' 的 <div> 元素

选取包含特定文本的元素

使用 contains() 来选取包含特定文本的元素,例如:

1
2
//div[contains(text(),'登录')]   # 选取所有包含文本 '登录' 的 <div> 元素
//a[contains(@href,'/user/')] # 选取所有 href 属性包含 '/user/' 的 <a> 元素

选取位置

使用方括号 [] 来选取位置,例如:

1
2
//ul/li[1]    # 选取所有 <ul> 元素的第一个 <li> 子元素
//table/tr[2]/td[1] # 选取所有 <table> 元素的第二个 <tr> 子元素的第一个 <td> 子元素

使用索引选择符合条件的第n个,例如

1
2
# 选取所有 符合条件的<ul>元素的第二个
(//ul[@class='ant-select-dropdown-menu'])[2]

这些是 XPath 的一些基本语法,可以用于定位 HTML 或 XML 文档中的元素或节点。需要注意的是,XPath 语法非常灵活,可以根据具体需求进行组合和定制。

查找当前节点之后的所有同级节点

  • following

following关键字用于查找当前节点之后的所有同级节点。以下是使用following的基本语法:

1
2
# 格式
<xpath expression>/following::<node name>

例如,假设有以下XML文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bookstore>
<book>
<title>Harry Potter and the Philosopher's Stone</title>
<author>J.K. Rowling</author>
</book>
<book>
<title>Harry Potter and the Chamber of Secrets</title>
<author>J.K. Rowling</author>
</book>
<book>
<title>Harry Potter and the Prisoner of Azkaban</title>
<author>J.K. Rowling</author>
</book>
</bookstore>

如果要查找第一个<book>元素之后的所有同级元素,可以使用以下XPath表达式:

1
/bookstore/book[1]/following::book

这将返回第二个和第三个<book>元素。

  • following-sibling

following-sibling是一个关键字,用于查找当前节点之后的所有同级节点。与following不同的是,following-sibling只查找当前节点之后的同级节点,而不包括后代节点。

以下是使用following-sibling的基本语法:

1
<xpath expression>/following-sibling::<node name>

其中,<xpath expression>是要查找的起始节点,<node name>是要查找的同级节点的名称。

例如,假设有以下XML文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bookstore>
<book>
<title>Harry Potter and the Philosopher's Stone</title>
<author>J.K. Rowling</author>
</book>
<book>
<title>Harry Potter and the Chamber of Secrets</title>
<author>J.K. Rowling</author>
</book>
<book>
<title>Harry Potter and the Prisoner of Azkaban</title>
<author>J.K. Rowling</author>
</book>
</bookstore>

如果要查找第一个<book>元素之后的所有同级元素,可以使用以下XPath表达式:

1
/bookstore/book[1]/following-sibling::book

这将返回第二个和第三个<book>元素,因为这两个元素是第一个<book>元素之后的同级元素。注意,这个表达式不会返回第一个<book>元素本身,因为following-sibling只查找当前节点之后的同级节点。

多个条件

在XPath中,可以使用逻辑运算符和多个谓语来同时指定多个条件。

下面是一些常用的逻辑运算符:

  • and: 与运算符,用于同时满足多个条件,例如://div[@class="foo" and @id="bar"]表示同时匹配class属性为fooid属性为bardiv元素。
  • or: 或运算符,用于满足多个条件中的任意一个,例如://div[@class="foo" or @class="bar"]表示匹配class属性为foobardiv元素。
  • not: 非运算符,用于匹配不满足指定条件的元素,例如://div[not(@class="foo")]表示匹配class属性不为foodiv元素。

多个谓语可以在一个XPath表达式中使用方括号[]来连接,例如:

1
//div[@class="foo"][position()<3]/a[text()="click"]

上述XPath表达式表示匹配class属性为foo且在父元素中的位置小于3的div元素下的文本为clicka元素。

选取不包含某属性的标签

排除一个属性

1
//tbody/tr[not(@class)]

排除一个或者多个属性

1
//tbody/tr[not(@class or @id)]

通过css定位:

css定位有N种写法,这里列几个常用写法:

1
2
3
4
5
6
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html body form span input")
dr.find_element_by_css_selector("span.soutu-btn input#kw")
dr.find_element_by_css_selector("form#form span input")

假如页面上有如下一组文本链接

1
2
<a href="http://news.baidu.com" rel="external nofollow" name="tj_trnews" 新闻</a 
<a href="http://www.hao123.com" rel="external nofollow" name="tj_trhao123" hao123</a
1
2
dr.find_element_by_link_text("新闻")
dr.find_element_by_link_text("hao123")
1
2
3
dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")

操作浏览器行为

常用的控制浏览器操作的一些方法

方法说明
set_window_size()设置浏览器的大小
back()控制浏览器后退
forward()控制浏览器前进
refresh()刷新当前页面
clear()清除文本
send_keys (value)模拟按键输入
click()单击元素
submit()用于提交表单
get_attribute(name)获取元素属性值
is_displayed()设置该元素是否用户可见
size返回元素的尺寸
text获取元素的文本

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from selenium import webdriver

from time import sleep
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口

browser = webdriver.Chrome(executable_path= "chromedriver.exe")

#2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")

sleep(3)

#3.刷新浏览器
browser.refresh()

#4.设置浏览器的大小
browser.set_window_size(1400,800)

#5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()

调用JavaScript代码

虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。

用于调整浏览器滚动条位置的JavaScript代码如下:

1
2
<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from selenium import webdriver
from time import sleep

# 1.访问百度
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.baidu.com')

# 2.搜索
drive.find_element_by_id('kw').send_keys('python')
drive.find_element_by_id('su').click()

# 3.休眠2s,获取服务器的响应内容
sleep(2)

# 4.通过javascript设置浏览器窗口的滚动条位置
drive.execute_script('window.scrollTo(0, 500)')
# drive.execute_script('window.scrollTo(0, document.body.scrollHeight)') #滑到最底部

sleep(2)
drive.close()

解决element click intercepted问题

一般element click intercepted问题都是在click行为期间发生的,是因为所点击元素被隐藏导致

解决该问题可以调用js来替代click方法

1
2
ele = driver.find_element_by_id('kw')
self.driver.execute_script("(arguments[0]).click()", ele)

获取页面源码数据

通过page_source属性可以获取网页的源代码,接着就可以使用解析库(如正则表达式、Beautiful Soup、pyquery等)来提取信息了。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from selenium import webdriver
from time import sleep

# 1.访问百度
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.baidu.com')

# 2.搜索
drive.find_element_by_id('kw').send_keys('python')
drive.find_element_by_id('su').click()

# 3.休眠2s,获取服务器的响应内容
sleep(2)

# 4.获取页面源码数据
text = drive.page_source
print(text)

drive.close()

cookie操作

有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。

WebDriver操作cookie的方法:

方法说明
get_cookies()获得所有cookie信息
get_cookie(name)返回字典的key为“name”的cookie信息
add_cookie(cookie_dict)添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
delete_cookie(name,optionsString)删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
delete_all_cookies()删除所有cookie信息

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.cnblogs.com/')

# 1.打印cookie信息
print(drive.get_cookies())

# 2.添加cookie信息
dic = {'name':'name', 'value':'python'}
drive.add_cookie(dic)
print(drive.get_cookies())

# 3.遍历打印cookie信息
for cookie in drive.get_cookies():
print(f"{cookie['name']}---f{cookie['value']}\n")

drive.close()

谷歌无头浏览器

PhantomJs已停止维护更新,这里使用谷歌的无头浏览器,是一款无界面的谷歌浏览器。很多时候我们爬取数据,并不想打开一个浏览器窗口进行操作,我们只需要获取数据或者拿到cookie然后进行操作。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 1.创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 2.创建浏览器对象
drive = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)

# 3.发起请求获取数据
drive.get('https://www.cnblogs.com/')

page_text = drive.page_source
print(page_text)

drive.close()

selenium规避被检测识别

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined。而使用selenium访问则该值为true。那么如何解决这个问题呢?

只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为['enable-automation'],完整代码如下:

示例

1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from selenium.webdriver import ChromeOptions

# 1.实例化一个ChromeOptions对象
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

# 2.将ChromeOptions实例化的对象option作为参数传给Crhome对象
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=option)

# 3.发起请求
driver.get('https://www.taobao.com/')

其他“奇技淫巧”

导包

1
2
3
4
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

获取某元素上方50像素的位置,然后点击

1
2
3
4
5
6
7
8
9
10
11
# 通过XPath定位到页面上文本内容为"注意事项"的div元素,并赋值给elem变量。
elem = driver.find_element_by_id("elementId")
# 获取elem元素的位置,location是一个字典,包含元素的x坐标和y坐标。
location = elem.location
# 这两行从location中分别取出元素的x坐标和y坐标,并将y坐标减去50,也就是向上偏移50个像素。
x = location['x']
y = location['y'] - 50
# 这一行创建一个ActionChains对象,用于执行鼠标操作
action = ActionChains(driver)
# 这一行以刚才取得的偏移后的x,y坐标为目标,进行移动操作,然后点击,最后调用perform()执行该动作。
action.move_by_offset(x, y).click().perform()

上述脚本存在一个问题:定位元素使用了绝对偏移坐标,重复执行时就可能导致点击位置超出元素范围。如果是希望点击举例指定元素的某个位置,可以进行如下修改:

  1. 每次获取元素位置时,都调用 location_once_scrolled_into_view,确保获取的是最新位置。

  2. 点击位置使用元素相对偏移,而不是绝对坐标偏移。

1
2
3
4
5
6
7
8
elem = driver.find_element_by_xpath("//div[text()='注意事项']")
# 每次都更新位置
location = elem.location_once_scrolled_into_view
x_offset = 0
y_offset = -100
action = ActionChains(driver)
# 使用相对偏移点击
action.move_to_element_with_offset(elem, x_offset, y_offset).click().perform()

获取屏幕向下300的位置,然后点击

1
2
3
4
5
6
# 计算目标位置坐标
script = "return {x: 0, y: window.innerHeight - 300}"
location = driver.execute_script(script)
# 点击目标位置
actions = ActionChains(driver)
action.move_by_offset(location['x'], location['y']).click().perform()

ElementClickInterceptedException

当使用driver.find_element(xxx).click()进行元素点击操作时,报错:ElementClickInterceptedException ,可使用如下方式替代

1
driver.execute_script("arguments[0].click();", driver.find_element(xxx))

Selenium Grid

介绍

Selenium 测试的主要组成部分有:测试代码、WebDriver、Grid(Selenium Server,非必需)、浏览器驱动(Driver)和浏览器。

当我们编写完 Selenium 测试用例在本地调试时,WebDriver 通过浏览器驱动直接与浏览器进行交互。这时,WebDriver、浏览器驱动和浏览器位于同一主机。这种最基本的交互方式如下图所示。

本地调试完成,使用自动化流水线触发执行测试用例时,一般不会使用上述这种 WebDriver 与浏览器(驱动)直接交互的方式,而会选择远程交互的方式。

远程交互方式是指 WebDriver 通过 Grid(Selenium Server)来与浏览器(驱动)远程交互。这时,Grid 可以不与浏览器及其驱动位于同一主机,测试代码及 WebDriver 也可以不与 Grid 或浏览器位于同一主机。这种远程交互的方式如下图所示。

可以看到,使用 Grid 以后,测试用例只需知道 Grid 的地址即可,无需安装浏览器及驱动,使得测试用例的执行变得非常简单。

安装

参考:https://github.com/SeleniumHQ/docker-selenium/tree/3.141.59-zirconium

docker-compose.yml:https://github.com/behappy-project/behappy-test-automation/blob/main/selenium.yml

注:selenium grid 4.0+版本改动很大,此安装版本以3.141为主

VNC Viewer

安装好的node-chrome-debug自带vnc server,所以这里使用vnc viewer监听其5900端口进行远程监控,默认连接密码是secret

地址:https://www.realvnc.com/en/connect/download/viewer/

安装好的vnc默认4个workspace,在测试时会交替执行,这里可以删除其它无用的workspace

Selenium IDE

Selenium介绍

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。Selenium家庭成员有三个,分别是Selenium WebDriver、Selenium IDE和Selenium Grid,这篇博客主要介绍Selenium IDE的使用方法。Selenium官网地址

Selenium IDE介绍

Selenium IDE是Chrome和FireFox浏览器中的插件,Selenium IDE结合浏览器提供脚本录制、脚本回放、脚本编辑、元素定位等功能,使用Selenium IDE可以将录制的脚本生成相应单元测试框架的自动化测试脚本,录制脚本支持导出Python pytest、Java JUnit、 NUnit等格式

Selenium IDE安装

Chrome浏览器安装

官网下载地址:点击进入,通过浏览器安装如下图,此方式不FQ无法进入页面

推荐使用此网站下载Chrome的插件,下载后解压zip压缩包,将selenium-ide.crx拖至Chrome拓展程序页面,等弹窗出现点击【添加】即可

FireFox浏览器安装

无需FQ,通过浏览器直接安装即可

Selenium IDE使用

Chrome和FireFox浏览器插件安装成功后,使用方法都是一样的,此处示例使用的是Chrome浏览器

点击浏览器菜单栏中的Selenium IDE图标,进入初始界面

Selenium IDE 窗口功能介绍

举个栗子:点击【Record a new test in a new project】,输入项目名称点击【OK】,输入URL地址点击【START RECORDING】,开始录制,自动打开界面,在界面进行操作后关闭窗口,点击录制停止按钮,输入用例标题点击【OK】,一条用例录制完成,如下图

导出用例

选中要导出的用例,点击鼠标右键→【Export】,选择要导出的格式,点击【Export】

导出测试套件也是相同的方法,先选择【Test Suites】,选择要导出的测试套件,点击鼠标右键→【Export】,选择要导出的格式,点击【Export】即可

以下是导出的上图中的用例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Generated by Selenium IDE
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

class TestUntitled():
def setup_method(self, method):
self.driver = webdriver.Chrome()
self.vars = {}

def teardown_method(self, method):
self.driver.quit()

def wait_for_window(self, timeout = 2):
time.sleep(round(timeout / 1000))
wh_now = self.driver.window_handles
wh_then = self.vars["window_handles"]
if len(wh_now) > len(wh_then):
return set(wh_now).difference(set(wh_then)).pop()

def test_untitled(self):
self.driver.get("https://www.bilibili.com/")
self.driver.set_window_size(1509, 918)
self.driver.find_element(By.CSS_SELECTOR, ".nav-search-keyword").click()
self.driver.find_element(By.CSS_SELECTOR, ".nav-search-keyword").send_keys("罗翔")
self.vars["window_handles"] = self.driver.window_handles
self.driver.find_element(By.CSS_SELECTOR, ".nav-search-submit").click()
self.vars["win7307"] = self.wait_for_window(2000)
self.vars["root"] = self.driver.current_window_handle
self.driver.switch_to.window(self.vars["win7307"])
self.driver.close()

通过PyCharm运行以上代码,需要先配置好环境

① 安装pytest,点击【File】→【Settings】→【Project:xxx.py】→【Python:Interpreter】点击添加按钮【+】,搜索pytest,选择安装包,点击【Install Package】,若还缺少其它包,通过此方法添加即可

② 已配置好WebDriver,ChromeDriver或者FireFoxDriver,具体依据所选浏览器,以ChromeDriver为例,配置方法请查看此文章

③ 在代码后添加main函数,如下:

1
2
if __name__ == '__main__':
pytest.main()

或者在Terminal中使用命令运行,如下:

1
python -m pytest test_case.py

通过PyCharm运行导出的用例,结果如下图,PyCharm中会显示测试结果

Selenium IDE其它操作

Selenium IDE有助于更深层次的学习Selenium,初学时期可以使用此工具,随着技能的提升,后续应自己多写测试脚本