蓝色的天_90  

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

 

 
posted on 2022-03-09 10:44  蓝色的天_90  阅读(1557)  评论(0编辑  收藏  举报