Selenium (软件)

Eric讨论 | 贡献2022年10月9日 (日) 04:20的版本

Selenium 是一个Web应用测试的开源框架,提供一系列Web浏览器自动化工具,可以模拟用户与浏览器的交互。Selenium IDE是一个Firefox插件,使用图形界面录制和测试。也可以通过Selenium WebDriver,使用多种语言来编写测试,包括:JavaPythonC#RubyJavaScriptKotlin

简介

主要工具

以下为Selenium提供的主要工具:

Selenium WebDriver:

Selenium IDE:

Grid:

安装 Selenium

使用不同的语言,安装Selenium方式不同。

Python中可以使用 pip 安装Selenium:

pip install selenium

也可以下载源代码安装。

JavaScript中可以使用 npm 安装 :

npm install selenium-webdriver

了解更多 >> Selenium 文档:安装 Selenium 库


安装浏览器和浏览器驱动

浏览器 支持的操作系统 维护者 驱动 驱动下载
Chromium/Chrome Windows/macOS/Linux 谷歌 ChromeDriver 下载
火狐 Windows/macOS/Linux Mozilla geckodriver 下载
Edge Windows 10 微软 msedgedriver 下载
Internet Explorer Windows Selenium 项目组 下载
Safari macOS El Capitan 及更高版本 苹果 内置
Opera Windows/macOS/Linux Opera 下载

Debian/Ubuntu下安装Chrome浏览器和ChromeDriver驱动为例:

#安装Chrome浏览器
#官网下载Chrome稳定版的deb包
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
#安装Chrome
sudo apt install ./google-chrome-stable_current_amd64.deb
#验证成功,查看chrome版本,结果如:Google Chrome 87.0.4280.88
google-chrome --version

#chromedriver驱动官网:https://chromedriver.storage.googleapis.com/index.html
#在官网查找下载chrome版本对应的chromedriver驱动。如Google Chrome 87.0.4280.88
wget https://chromedriver.storage.googleapis.com/87.0.4280.88/chromedriver_linux64.zip
#解压缩
unzip chromedriver_linux64.zip
#可以将chromedriver文件放置在环境变量路径(通过echo $PATH查看)上。
mv chromedriver /usr/bin

在命令行输入驱动名,验证是否添加成功。

chromedriver  # chrome
geckodriver  # firefox

检测安装成功

以Python语言示例:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.baidu.com')

如果不将驱动加入环境变量,需要在每次使用时,指定驱动路径。以Python使用为例:

# executable_path 在selenium 4 已弃用
from selenium import webdriver
from selenium.webdriver.firefox.service import Service

s = Service(r'D:\geckodriver-v0.31.0-win6\geckodriver.exe')
driver = webdriver.Firefox(service=s)
driver.get('https://www.baidu.com')

常见错误:

加入环境变量后,在代码中还是显示找不到

重启编辑器即可。

了解更多 >> Selenium 文档:WebDriver > 驱动要求


快速入门

浏览器

名称 描述 示例
Chrome
from selenium import webdriver
driver = webdriver.Chrome()
firefox
from selenium import webdriver
driver = webdriver.Firefox()

无头浏览器

Python语言示例:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')  #
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(chrome_options=chrome_options) #如果chromedriver没有添加到环境变量中,就需要添加参数指明路径executable_path='/path/to/chromedriver'

driver.get("https://www.baidu.com")
print(driver.page_source)
client.quit()

浏览器设置

浏览器参数

了解更多 >> selenium 文档:browsers/chrome Peter Beverloo:List of Chromium Command Line Switches


操控浏览器

以下Python编程语言示例:

from selenium import webdriver

driver = webdriver.Chrome()

浏览器导航

操作 描述 Python示例
打开网站 浏览器输入地址,打开网站 driver.get("https://www.baidu.com")
获取当前 URL 从浏览器的地址栏读取当前的 URL driver.current_url
后退 按下浏览器的后退按钮 driver.back()
前进 按下浏览器的前进键 driver.back()
刷新 刷新当前页面 driver.refresh()
获取标题 从浏览器中读取当前页面的标题 driver.title

窗口和标签页

WebDriver 没有区分窗口和标签页。如果你的站点打开了一个新标签页或窗口,Selenium 将允许您使用窗口句柄来处理它。 每个窗口都有一个唯一的标识符,该标识符在单个会话中保持持久性。

操作 描述 Python示例
窗口句柄 获得当前窗口的窗口句柄 driver.current_window_handle
切换窗口或标签页
创建新窗口或新标签页,并且切换 创建一个新窗口或标签页,屏幕焦点将聚焦在新窗口或标签在上。注意:该特性适用于Selenium 4 +
关闭窗口或标签页 当你完成了一个窗口或标签页的工作时,_并且_它不是浏览器中最后一个打开的窗口或标签页时,你应该关闭它并切换回你之前使用的窗口。 driver.close()
退出浏览器 调用quit退出浏览器。退出将会关闭所有与 WebDriver 会话相关的窗口和选项卡,结束浏览器进程,结束后台驱动进程,通知 Selenium Grid 浏览器不再使用,以便可以由另一个会话使用 driver.quit()


了解更多 >> Selenium 文档:WebDriver - 操控浏览器


网络元素

WebElement表示DOM元素。

查找元素

可以通过使用WebDriver实例从文档根节点进行搜索,或者在另一个WebElement下进行搜索来找到WebElement。

操作 方法 描述 Python示例
查找单个元素 Find Element 此方法用于查找元素并返回第一个匹配的单个WebElement引用。 driver.find_element(By.NAME, "q")
查找多个元素 Find Elements 与"Find Element"相似, 但返回的是匹配WebElement列表。要使用列表中的特定WebElement,您需要遍历元素列表以对选定元素执行操作。 driver.find_elements(By.TAG_NAME, 'p')
查找当前页面上下文中具有焦点的元素 Active Element 此方法用于追溯或查找当前页面上下文中具有焦点的DOM元素 driver.switch_to.active_element

WebDriver API提供了内置方法来查找基于不同属性的WebElement (例如ID, Name, Class, XPath, CSS选择器, 链接文本等)。以下使用查找单个元素Find Element示例,查找多个元素Find Elements同样适用。

操作 描述 Python 示例 Python 等价方法
By ID 通过ID查找元素。适用元素如:<div id="q">...</div> driver.find_element(By.ID, "q") driver.find_element_by_id("q")
By Name 通过Name查找元素。适用元素如:<input name="btnK">...</input> driver.find_element(By.NAME, 'btnK') find_element_by_name() 
By Class Name 通过Class Name查找元素。适用元素如:<p class="rk">...</p> driver.find_element(By.CLASS_NAME, 'rk') find_element_by_class_name() 
By Tag Name 通过标签名查找元素 driver.find_element(By.TAG_NAME, "div") find_element_by_tag_name()
By Link Text 通过链接文本查找元素 driver.find_element(By.LINK_TEXT, "更多信息...") find_element_by_link_text() 
By Partial Link Text 通过部分链接文本查找元素 driver.find_element(By.PARTIAL_LINK_TEXT, "更多信") find_element_by_partial_link_text()
By CSS 通过CSS选择器查找元素 driver.find_element(By.CSS_SELECTOR, "h1") find_element_by_css_selector()
By XPath 通过XPath查找元素。 driver.find_element(By.XPATH, "//form[1]") find_element_by_xpath()


元素属性和方法

操作 方法或属性 描述 Python示例
元素是否被启用或禁用 Is Enabled 此方法用于检查网页上连接的元素是否被启用或禁用. 返回一个布尔值, 如果在当前浏览上下文中启用了连接的元素, 则返回True; 否则返回false 。 driver.find_element(By.NAME, 'btnK').is_enabled()
元素是否被选中 Is Selected 此方法确定是否 已选择 引用的元素. 此方法广泛用于复选框, 单选按钮, 输入元素和选项元素.返回一个布尔值, 如果在当前浏览上下文中 已选择 引用的元素, 则返回 True, 否则返回 False。 driver.find_element(By.CSS_SELECTOR, "input[type='checkbox']:first-of-type").is_selected()
元素标签名 Get TagName 获取元素的TagName(标签名)。 driver.find_element(By.CSS_SELECTOR, "h1").tag_name
元素的尺寸和坐标 Get Rect 用于获取参考元素的尺寸和坐标,提取的数据主体包含以下详细信息:1.元素左上角的X轴位置,2.元素左上角的y轴位置,3.元素的高度,4.元素宽度 driver.find_element(By.CSS_SELECTOR, "h1").rect
元素CSS值 Get CSS Value 获取当前浏览上下文中元素的特定计算样式属性的值。 ddriver.findElement(By.LINK_TEXT, "More information...").value_of_css_property('color')
获取元素文本 Get Text 获取特定元素渲染后的文本 driver.find_element(By.CSS_SELECTOR, "h1").text

了解更多 >> Selenium 文档:WebDriver - 网络元素 baijum/selenium python文档:Locating Elements


键盘操作

键盘操作通过使用底层接口允许我们向web浏览器提供虚拟设备输入。

键盘输入

sendKeys用于模拟键盘输入。不同语言版本中函数名有一些差别,如Java中使用sendKeys()函数,Python中使用send_keys()函数。以下示例为Python版,打开百度网页,在输入框输入”webdriver“并按回车键:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome() 

# 打开百度页面
driver.get("http://www.baidu.com")

# 输入"webdriver"文本和输入"ENTER"按键
driver.find_element(By.ID, "kw").send_keys("webdriver" + Keys.ENTER)

# 查看页面代码
driver.page_source

按下按键

keyDown用于模拟按下辅助按键(CONTROL, SHIFT, ALT)的动作。

按键弹起

keyUp用于模拟辅助按键(CONTROL, SHIFT, ALT)弹起或释放的操作。

清除

clear用于清除可编辑元素的内容。

了解更多 >> Selenium 文档:WebDriver - Keyboard



资源

官网

相关网站

参考资料