Selenium
简介
selenium
是一个web
浏览器自动化测试框架,它使用的太过于广泛以致于基于Selenium WebDriver
衍生出W3C
的WebDriver
标准(WebDriver
简介)。它主要包含Selenium
客户端、Selenium
服务端、Selenium Webdriver
、Selenium Grid
(支持分布式部署,本文不展开),可能的组网图连接请参考这里。
-
Selenium
客户端:创建自动化测试脚本,跟本地(Selenium Webdriver
)或远程(Selenium Server (Remote WebDriver)
)驱动进行交互,支持多种语言包括C#
、Ruby
、Java
、Python
、JavaScript
。 -
Selenium
服务端:这里指的是位于服务端机器上的Java
小程序,用于监听客户端的请求,并调用不同的驱动来控制浏览器的行为,主要用于远程测试(客户端和服务端不在同一个机器)。 -
Selenium Webdriver
:能控制浏览器行为的驱动,不同的浏览器会提供不同的能力/命令,因此会有不同的驱动实现。通常,Selenium Webdriver
和被测浏览器要在同一台机器上,例如ChromeDriver
是用于Chrome
相关浏览器的驱动。 -
Selenium Grid
:如果需要在多个机器上进行分布式测试,需要用到该组件。实际上,如果是跟驱动、被测浏览器在同一台机器上,它就是Selenium
服务端。
1、创建会话
-
创建本机测试会话
客户端测试脚本、驱动、浏览器位于同一台机器。因此客户端提供了
Service
对象,用于管理与驱动的交互和控制,而不需要额外的Selenium
服务端。例如对于Chrome
浏览器:
service = ChromeService()
driver = webdriver.Chrome(service=service)
-
创建远程测试会话
客户端和驱动位于不同的机器,客户端需要指定服务端的地址进行会话的建立(通过指定驱动支持的能力参数)。因此这种情况下,需要在远程服务端机器上安装服务端程序(包含驱动),客户端脚本实例如下:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.set_capability("browserVersion", "67")
chrome_options.set_capability("platformName", "Linux")
driver = webdriver.Remote(
command_executor='http://www.xxx.com',
options=chrome_options
)
2、Selenium
定义所有浏览器应支持的能力参数集
具体描述 | 默认值 | |
---|---|---|
browserName |
指定被测浏览器的名称,如果指定的浏览器未安装,会话将创建失败。 | 无 |
browserVersion |
指定被测浏览器的版本,如果指定的浏览器与实际版本不匹配,例如指定的版本是75 ,实际浏览器的版本是80 ,那么会话将创建失败。 |
无 |
pageLoadStrategy |
指定页面加载策略,有三个策略:1)normal ,默认值,等待所有的资源加载完成;2)eager ,DOM 访问已经准备好,但是其他资源例如图片仍在加载中;3)none ,完全不要阻塞WebDriver 。 |
normal |
platformName |
服务端操作系统版本。 | 无 |
acceptInsecureCerts |
指示浏览器是否信任过期或者无效的TLS 证书。设置为true ,浏览器将信任无效的证书。所有自签名的证书默认被信任。 |
false |
timeouts |
会话相关的超时时间设置,单位是毫秒。有以下几类时间:1)脚本超时时间,中止当前浏览上下文的自己执行脚本的超时时间,默认是30000 毫秒;2)页面加载超时,当前浏览上下文中的页面加载超时时间,默认是300000 毫秒;3)隐性等待时间,界面元素定位时的等待时间。 |
|
unhandledPromptBehavior |
当前会话的用户提示处理程序,默认是dismiss and notify state。 | dismiss and notify |
setWindowRect |
布尔值,表明远端是否支持所有的窗口调整和定位命令。 | false |
strictFileInteractability |
表示是否应该对输入type=file 元素应用严格的可交互性检查,默认禁止。 |
false |
proxy |
定义当前会话的代理配置。 | 无 |
3、编写web
浏览器自动化测试的步骤
编写Selenium
自动化脚本的八个步骤:
-
启动会话
-
在浏览器上执行动作
-
请求浏览器的信息
-
设定等待策略:当前界面元素的状态同步是最大的挑战之一,必须要保证界面元素在被定位前已经呈现,所以使用哪种等待策略就非常重要。
-
查找界面元素
-
在查找到的界面元素上执行动作
-
请求该界面元素的信息
-
结束会话
4、实例展示
本文的客户端语言是Python
,实现一个对本机的Chrome
浏览器的自动化测试脚本,它将打开浏览器,输入一个网址,并获取返回结果。
准备工作:
注意,ChromeDriver
要和Chrome
版本匹配。
1、下载ChromeDriver
,地址:https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2F1134343%2Fchromedriver_linux64.zip?generation=1682290630542383&alt=media。
2、下载Chrome
浏览器:当前最新的ChromeDriver
只支持到Chrome
的114
版本,所以要下载114
版本的Chrome
浏览器,地址:https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2F1134343%2Fchrome-linux.zip?generation=1682290626198822&alt=media。
3、编写测试脚本
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeDriverService
from selenium.webdriver.chrome.options import Options
def test_first_selenium_for_chrome():
# 启动会话
chrome_driver_path = "/home/chrometest/chromedriver/chromedriver" # 指定ChromeDriver的路径
options = Options()
options.binary_location = "/home/chrometest/chrome/chrome" # 指定Chrmoea浏览器的路径
service = ChromeDriverService(executable_path=chrome_driver_path)
driver = webdriver.Chrome(service=service, options=options)
# 在浏览器上执行动作,此处是指定浏览器要打开的网址(selenium官网提供的测试地址)
url = "https://www.selenium.dev/selenium/web/web-form.html"
driver.get(url)
# 请求浏览器的信息:获取指定网址执行结果
title = driver.title
# 设置等待策略:此处是固定等待0.5S
driver.implicitly_wait(0.5)
# 定位指定的界面元素
text_box = driver.find_element(by=By.NAME, value="my-text")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")
# 在定位到的元素上执行动作
text_box.send_keys("Selenium")
submit_button.click()
# 获取元素执行动作后的信息
message = driver.find_element(by=By.ID, value="message")
value = message.text
assert value == "Received!"
网友评论