【问题标题】:Selenium Firefox headless returns different resultsSelenium Firefox headless 返回不同的结果
【发布时间】:2020-03-20 17:41:48
【问题描述】:

当我抓取包含使用无头选项的产品的页面时,我会得到不同的结果。
对于同一个问题,一次我得到未排序的结果,另一次得到正确排序的结果。

硒火狐浏览器:

firefox_options = Options()
firefox_options.headless = True
browser = webdriver.Firefox(options=firefox_options, executable_path=firefox_driver)

this发帖:
“使用无头选项时,firefox 不会发送不同的标头”。

如何使用无头选项从抓取中获得恒定的结果?

更新:

事实证明,广告弹出窗口隐藏了价格排序菜单。通过设置DebanjanB 发布的恒定窗口大小,问题得到解决。

感谢您的任何建议

【问题讨论】:

    标签: python selenium geckodriver headless-browser firefox-headless


    【解决方案1】:

    理想情况下,使用和不使用firefox_options.headless = True 不会对DOM Tree 中的元素渲染产生任何重大影响,但就Viewport 而言可能会有显着差异。

    例如,当 GeckoDriver/Firefox 与 --headless 选项一起初始化时,默认的 Viewportwidth = 1366px, height = 768px,其中当 GeckoDriver/Firefox 在没有 --headless 选项的情况下初始化时,默认的 Viewportwidth = 1382px, height = 744px

    • 示例代码:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
      options = webdriver.FirefoxOptions()
      options.headless = True
      driver = webdriver.Firefox(options=options, executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
      driver.get("https://www.google.com/")
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q")))
      print ("Headless Firefox Initialized")
      size = driver.get_window_size()
      print("Window size: width = {}px, height = {}px".format(size["width"], size["height"]))
      driver.quit()
      driver = webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
      driver.get("https://www.google.com/")
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q")))
      print ("Firefox Initialized")
      size = driver.get_window_size()
      print("Window size: width = {}px, height = {}px".format(size["width"], size["height"]))
      driver.quit()
      
    • 控制台输出:

      Headless Firefox Initialized
      Window size: width = 1366px, height = 768px
      Firefox Initialized
      Window size: width = 1382px, height = 744px
      

    结论

    从以上观察可以推断,使用 --headless 选项 GeckoDriver/Firefox 打开 Browsing Context 并减少 Viewport,因此识别的元素数量可以是


    解决方案

    在使用 GeckoDriver/Firefox 启动浏览上下文时,始终以 maximized 模式打开或通过set_window_size() 进行如下配置:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.FirefoxOptions()
    options.headless = True
    #options.add_argument("start-maximized")
    options.add_argument("window-size=1400,600")
    driver = webdriver.Firefox(options=options, executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
    driver.get("https://www.google.com/")
    driver.set_window_size(1920, 1080)
    

    tl;博士

    您可以在以下位置找到一些关于窗口大小的相关讨论:

    【讨论】:

    • 嗨,我没有询问最大化或调整窗口大小。问题是在无头模式下,响应上下文与没有此模式时不同。
    • @ZarakiKenpachi 这可能是由于我在答案中详细说明的观点不同而发生的。
    • 谢谢。事实证明,生成的弹出广告窗口隐藏了排序菜单。设置较大的窗口大小问题后解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2019-01-18
    • 2012-11-30
    • 2019-06-03
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多