首先我们要看一手资料,selenium官网 ,我这里主要介绍一下从3到4 有哪些变化
1、 Selenium 4 移除了对遗留协议的支持, 并在底层实现上默认使用 W3C WebDriver 标准.对于大多数情况, 这种实现不会影响终端用户.主要的例外是 Capabilities
和 Actions
类
1.1、Capabilities
如果测试capabilities的结构不符合 W3C标准, 可能会导致会话无法正常开启.以下是 W3C WebDriver 标准capabilities列表:
browserName
browserVersion
(替代version
)platformName
(替代platform
)acceptInsecureCerts
pageLoadStrategy
proxy
timeouts
unhandledPromptBehavior
下面具体说明,例子是官方文档中提到的
#selenium 3.x 版本
caps = {}
caps['browserName'] = 'firefox'
caps['platform'] = 'Windows 10'
caps['version'] = '92'
caps['build'] = my_test_build
caps['name'] = my_test_name
driver = webdriver.Remote(cloud_url, desired_capabilities=caps)
#selenium 4 版本
from selenium.webdriver.firefox.options import Options as FirefoxOptions
options = FirefoxOptions()
options.browser_version = '92'
options.platform_name = 'Windows 10'
cloud_options = {}
cloud_options['build'] = my_test_build
cloud_options['name'] = my_test_name
options.set_capability('cloud: options', cloud_options)
driver = webdriver.Remote(cloud_url, options=options)
以下是我实际的代码变化
from selenium.webdriver.chrome.options import Options
def get_brows():
'''
页面基础类,用于所有页面的继承
'''
path_dir = str(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)))
#print(path_dir)
# driver_path=get_test_params.pychram_dir+GetPages.get_page_list().get("ParamsPath")[0].get("chrome_driver_path")
download_path = str(os.path.abspath('../../..')) + GetPages.get_page_list().get("ParamsPath")[0].get("files_download_path")
url =GetPages.get_page_list().get("EnvConfig")[0].get("url_pa")
username = GetPages.get_page_list().get("Login")[0].get("username")
password = GetPages.get_page_list().get("Login")[0].get("password")
# print("chrome_driver",driver_path)
chrome = GetPages.get_page_list().get("EnvConfig")[0].get("node_param")["browser"][0]
chrome_options = Options()
# 加上下面两行,解决报错
chrome_options.add_argument('--no-sandbox') # “–no-sandbox”参数是让Chrome在root权限下跑
chrome_options.add_argument('--disable-dev-shm-usage')
# chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加
chrome_options.add_argument('--disable-gpu') # 禁用gpu加速,谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_experimental_option('w3c', False)
# chrome_options.add_argument('blink-settings=imagesEnabled=false') ## 不加载图片, 提升速度
# 设置开发者模式启动,该模式下webdriver属性为正常值
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
# 手动指定使用的浏览器位置
# chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': download_path}
chrome_options.add_experimental_option("prefs", prefs)
# selenium_driver = webdriver.Chrome(executable_path=driver_path,
# desired_capabilities={'platform': 'ANY',
# 'browserName': chrome,
# 'javascriptEnabled': True},
# options=chrome_options)
selenium_driver = webdriver.Remote(command_executor='http://ip:4445',
desired_capabilities={'platform': 'ANY',
'browserName': chrome,
'javascriptEnabled': True},
options=chrome_options)
最新
def test_selenium_grid():
path_dir = str(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)))
# print(path_dir)
# driver_path=get_test_params.pychram_dir+GetPages.get_page_list().get("ParamsPath")[0].get("chrome_driver_path")
download_path = str(os.path.abspath('../../..')) + GetPages.get_page_list().get("ParamsPath")[0].get(
"files_download_path")
chrome = GetPages.get_page_list().get("EnvConfig")[0].get("node_param")["browser"][0]
chrome_options = Options()
# 加上下面两行,解决报错
chrome_options.add_argument('--no-sandbox') # “–no-sandbox”参数是让Chrome在root权限下跑
chrome_options.add_argument('--disable-dev-shm-usage')
# # chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加
chrome_options.add_argument('--disable-gpu') # 禁用gpu加速,谷歌文档提到需要加上这个属性来规避bug 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)
chrome_options.add_argument('start-fullscreen') #全屏启动
# chrome_options.add_argument('blink-settings=imagesEnabled=false') ## 不加载图片, 提升速度
# # 设置开发者模式启动,该模式下webdriver属性为正常值
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
# # 手动指定使用的浏览器位置
# # chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': download_path}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_experimental_option('w3c', True)
chrome_options.platform_name='Linux'
selenium_driver = None
try:
selenium_driver = webdriver.Remote(command_executor='http://ip:4445',
desired_capabilities={'browserName': chrome,
'javascriptEnabled': True},
options=chrome_options)
selenium_driver.get('http://test.com.cn')
selenium_driver.implicitly_wait(15)
selenium_driver.get_screenshot_as_file("./test_img.png")
print("OK")
finally:
if selenium_driver is not None:
selenium_driver.quit()
ps: 这里设置了
chrome_options.browser_version='98'
导致启动之后一直报错,去掉之后即正常
估计的错误原因是 browser_version 版本号的添加,这个版本号不是很确定就不要填写,因为我用的是远程容器部署,还有platform_name 这个在实际测试过程中不填写也不会影响实际的测试情况
1.2、python 中executable_path 已弃用, 请传递一个服务对象
#selenium3
from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options) #这里就涉及到 我们本地的浏览器驱动的加载变化
#selenium4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
service = ChromeService(executable_path=CHROMEDRIVER_PATH)
driver = webdriver.Chrome(service=service, options=options)
2、切换窗口或标签页
单击在 <a href=“https://seleniumhq.github.io"target="_blank”>新窗口 中打开链接, 则屏幕会聚焦在新窗口或新标签页上,但 WebDriver 不知道操作系统认为哪个窗口是活动的。 要使用新窗口,您需要切换到它。 如果只有两个选项卡或窗口被打开,并且你知道从哪个窗口开始, 则你可以遍历 WebDriver, 通过排除法可以看到两个窗口或选项卡,然后切换到你需要的窗口或选项卡。
不过,Selenium 4 提供了一个新的 api NewWindow 它创建一个新选项卡 (或) 新窗口并自动切换到它。
先看一下原来的selenium3 操作办法
#selenium 3
def enterAuthVerification(self):
self.selenium_driver.get(self.url)
# 输出当前窗口句柄(首页)
first_handles = self.selenium_driver.window_handles
self.find_element(*self.auth_verification_href).click()
sleep(2)
# 判断新窗口打开
WebDriverWait(self.selenium_driver, 10).until(EC.new_window_is_opened(first_handles))
# 切换到原始串口
#self.driver.switch_to_window(self.driver.window_handles[0])
# 切换到新打开窗口
self.selenium_driver.switch_to_window(self.selenium_driver.window_handles[-1])
这里重点将
selenium_driver.switch_to_window 方法改造了 driver.switch_to.window
def enterAuthVerification(self):
self.selenium_driver.get(self.url)
# 输出当前窗口句柄(首页)
# first_handles = self.selenium_driver.window_handles
first_handles = self.selenium_driver.current_window_handle
# 检查一下,我们还没有打开其他的窗口
assert len(self.selenium_driver.window_handles) == 1
#在新窗口打开链接
self.find_element(*self.auth_verification_href).click()
# 等待新窗口或标签页
wait.until(EC.number_of_windows_to_be(2),10)
# 判断新窗口打开
# 循环执行,直到找到一个新的窗口句柄
for window_handle in self.selenium_driver.window_handles:
if window_handle != first_handles:
self.selenium_driver.switch_to.window(window_handle)
break