【问题标题】:How to make Selenium not wait till full page load, which has a slow script?如何让 Selenium 不等到整个页面加载,它的脚本很慢?
【发布时间】:2017-11-29 22:44:27
【问题描述】:

Selenium driver.get (url) 等到整页加载。但是一个抓取页面会尝试加载一些死掉的 JS 脚本。所以我的 Python 脚本等待它并且不能工作几分钟。这个问题可能出现在网站的每个页面上。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.cortinadecor.com/productos/17/estores-enrollables-screen/estores-screen-corti-3000')
# It try load: https://www.cetelem.es/eCommerceCalculadora/resources/js/eCalculadoraCetelemCombo.js 
driver.find_element_by_name('ANCHO').send_keys("100")

如何限制等待时间,阻止文件的AJAX加载,或者其他方式?

我还在webdriver.Chrome() 中测试我的脚本,但将使用 PhantomJS(),或者可能是 Firefox()。因此,如果某些方法使用了浏览器设置的更改,那么它必须是通用的。

【问题讨论】:

    标签: python selenium google-chrome selenium-chromedriver pageloadstrategy


    【解决方案1】:

    @undetected Selenium 答案效果很好,但对于 chrome,部分不起作用,请使用以下 chrome 答案

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    capa = DesiredCapabilities.CHROME
    capa["pageLoadStrategy"] = "none"
    browser= webdriver.Chrome(desired_capabilities=capa,executable_path='PATH',options=options)
    
    

    【讨论】:

      【解决方案2】:

      当 Selenium 默认加载页面/url 时,它遵循默认配置,pageLoadStrategy 设置为 normal。为了使 Selenium 不等待整个页面加载,我们可以配置 pageLoadStrategypageLoadStrategy 支持如下 3 种不同的值:

      1. normal(整页加载)
      2. eager(互动)
      3. none

      这是配置pageLoadStrategy的代码块:

      • 火狐

        from selenium import webdriver
        from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
        
        caps = DesiredCapabilities().FIREFOX
        caps["pageLoadStrategy"] = "normal"  #  complete
        #caps["pageLoadStrategy"] = "eager"  #  interactive
        #caps["pageLoadStrategy"] = "none"
        driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r'C:\path\to\geckodriver.exe')
        driver.get("http://google.com")
        
      • Chrome

        from selenium import webdriver
        from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
        
        caps = DesiredCapabilities().CHROME
        caps["pageLoadStrategy"] = "normal"  #  complete
        #caps["pageLoadStrategy"] = "eager"  #  interactive
        #caps["pageLoadStrategy"] = "none"
        driver = webdriver.Chrome(desired_capabilities=caps, executable_path=r'C:\path\to\chromedriver.exe')
        driver.get("http://google.com")
        

      注意pageLoadStrategynormaleagernone 是根据WebDriver W3C Editor's Draft 的要求,但pageLoadStrategy 值作为eager 仍然是ChromeDriver 实施中的WIP(正在进行的工作)。详细讨论可以在“Eager” Page Load Strategy workaround for Chromedriver Selenium in Python

      【讨论】:

      • 它适用于 Firefox()。在 Chrome() 中,“eager”选项会引发“不支持”错误。运行如下: caps = DesiredCapabilities().CHROME caps["pageLoadStrategy"] = "none" driver = webdriver.Chrome(desired_capabilities=caps) driver.get('href...') time.sleep(5) driver.find_element_by_name(' ANCHO').send_keys("100")
      • @bl79 是的 :) 我知道。我的建议来自 WebDriver 的 W3C 推荐。 ChromeDriver 将很快效仿。谢谢
      • 而不是time.sleep,最好使用driver.implicitly_wait
      • Chrome 仍然没有效仿,似乎也不会效仿
      • @TimWachter 查看我的答案更新,让我知道你的想法。
      猜你喜欢
      • 2014-09-26
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2015-11-28
      • 2018-03-20
      相关资源
      最近更新 更多