当前位置: 首页 > 知识库问答 >
问题:

Selenium Firefox无头返回不同的结果

孟韬
2023-03-14

当我浏览包含使用headless选项的产品的页面时,我会得到不同的结果
对于同一个问题,一次我得到的结果没有排序,另一次得到的结果排序正确。

Selenium firefox浏览器:

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

根据这篇帖子:
“firefox在使用headless选项时不会发送不同的标题”。

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

更新:

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

谢谢你的建议

共有1个答案

叶翰林
2023-03-14

理想情况下,使用和不使用firefox_选项。headless=True不应对DOM树中的元素进行渲染产生任何重大影响,但就视口而言,可能会产生显著差异。

例如,当GeckoDriver/Firefox与--headless选项一起初始化时,默认视口为width=1366px,height=768px,其中当GeckoDriver/Firefox在没有--headless选项的情况下初始化时,默认视口为width=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打开浏览上下文,减少了视口,因此识别的元素数量可以减少。

    在使用GeckoDriver/Firefox启动浏览上下文时,始终以最大化模式打开,或通过设置窗口大小()进行如下配置:

    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)
    

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

    • python:如何设置窗口大小在硒ChromePython
    • java:无法最大化Chrome窗口在无头模式

  •  类似资料:
    • 问题内容: 当我抓取包含使用无头选项产品的页面时,我得到不同的结果。 对于同一个问题,一次我得到未排序的结果,而另一次我得到正确的排序顺序。 Selenium firefox浏览器: 根据这篇文章: “ firefox使用无头选项时不会发送不同的头”。 如何使用无头选项从抓取中获得恒定的结果? 更新: 事实证明,广告弹出窗口隐藏了价格排序菜单。通过设置DebanjanB发布的恒定窗口大小,解决了问

    • 问题内容: 我正在使用HSM和PKCS11处理密钥派生问题,目前我无法理解为什么我会看到完全不同的结果,这取决于我是否使用generateKey()方法,而不是使用crypto()方法。在这两种情况下,我都尝试将DESede / ECB / NoPadding算法用于结果,但是根据我用来生成结果的方法(deriveKey与加密),我看到了不同的结果。 退后一会儿,以给出高层次的概述…我正在使用Gl

    • 问题内容: 我正在运行以下MySQL查询,以查找没有手册(且车轮有黑轮等)的汽车 查询的结果看起来正确,但是它两次返回ID为27的汽车。如何更改查询,以使所有结果都是唯一的(没有重复项)? 问题答案: 假定这是唯一的主键,那么其中的一种联接将导致笛卡尔乘积。也就是说:或包含多个匹配项。 子查询通常是消除笛卡尔积的好工具。下面的示例查询显示了两种使用子查询的方法。 第一个子查询可确保我们只查看在20

    • 我有一个简单的代码,可以从第14列开始将转置的范围复制到另一张表的最后一行 它按原样返回零结果。如果我将destrow从公式更改为simple 2(这是现在最后一个空行),则效果很好。为什么不返回目标工作表中的最后一行索引?

    • 我正在尝试处理新的AndroidLollipopMediaProjection API。 我发现(至少在我的股票三星Galaxy S4 jfltexx上),当我开始意图获取捕获屏幕的权限()时,除非我在前面的尝试中选中了“不要再次询问”,否则在中不会有结果... 和结果处理: 权限对话框显示得很好,但是我的活动被隐藏了,它永远不会转到。 知道出什么问题了吗?

    • 虽然运行与SQL查询相同的查询并获取结果,但在ifCurrent中未获取任何结果。 我是否传递了错误的参数? 这就是在学校里通过的