如何使Selenium不要等到整页加载,脚本速度慢?

时间:2017-06-27 00:55:21

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

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()。因此,如果某些方法使用浏览器设置的更改,那么它必须是通用的。

2 个答案:

答案 0 :(得分:18)

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

  1. normal (整页加载)
  2. eager (互动)
  3. none
  4. 以下是配置 pageLoadStrategy

    的代码块
    • Firefox

      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")
      
      

    注意pageLoadStrategy normal eager {{1 }} 是符合WebDriver W3C Editor's Draft但<{1}}值的要求,因为 none 仍然是 WIP(正在进行中) ChromeDriver 实施中。您可以在“Eager” Page Load Strategy workaround for Chromedriver Selenium in Python

    中找到详细的讨论

答案 1 :(得分:1)

  

Selenium Webdriver提供两种类型的等待 - 隐式和&amp;明确。显式等待使WebDriver在继续执行之前等待某个条件发生。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()
  

在抛出TimeoutException之前等待最多10秒,除非它在10秒内找到要返回的元素。

因此,解决方案可能是设置等待的时间,如果元素在该固定时间段内没有被捕获,则捕获异常并记录事件或不执行任何操作,最后继续。代码示例取自here