詳談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