详谈selenium3.x 升级到selenium4.1.2


首先我们要看一手资料,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

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM