【问题标题】:Selenium + Python: How to stop page loading when certain element gets loaded?Selenium + Python:加载某些元素时如何停止页面加载?
【发布时间】:2017-11-14 04:10:45
【问题描述】:

当页面使用AJAX时可以使用隐式和显式等待,但是我想在加载足够的元素时停止由driver.get()引起的加载。是否可以这样做,因为 driver.get() 调用仅在页面加载完成时返回。

【问题讨论】:

  • 现在你为什么要这样做,假设你等待一个按钮显示。一旦按钮显示你做任何你想做的事,它不会等待页面完全加载后再执行你的命令,除非你有其他原因,否则它是没用的。
  • @ElvirMuslic 但是对 driver.get() 的调用仅在页面完全加载完成时返回。就像我想在按钮可见时以编程方式单击该按钮,而不是等待整个页面加载。
  • 并非如此,driver.get() 只是发出它不等待元素加载的请求。如果您说 driver.something.click() 它会在收到有关页面的任何响应后立即执行它,如果元素不存在,它将引发错误。意思是, 1.driver.get() 等待来自页面的任何响应(不是全部)。 2. 您可以执行任何您想要的操作,并且页面不必完全加载,但它会在您执行这些操作时加载。 3.我猜这可以用来节省时间和使用量(对于大型项目)
  • @ElvirMuslic 作为 Florent 的回答,driver.get() 只有在页面加载策略设置为 none 时才等待页面加载。

标签: python selenium


【解决方案1】:

是的,可以将pageLoadStrategy 功能设置为none。然后等待元素出现并调用window.stop 停止加载:

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

capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"

driver = webdriver.Chrome(desired_capabilities=capa)
wait = WebDriverWait(driver, 20)

driver.get('http://*.com/')

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#h-top-questions')))

driver.execute_script("window.stop();")

【讨论】:

  • 如果我想在本地执行这段代码,我需要在本地做什么?我了解依赖项要求,但我需要在上述测试中指向 chromedriver 吗?如果没有语言绑定,您将如何执行上述操作?
  • @Wunderbread,我不确定“没有语言绑定”是什么意思,但是要在本地执行代码,请将 chromedriver 放在 PATH 环境变量中或提供路径构造函数 (webdriver.Chrome)。
  • 知道了,谢谢。我的意思是在没有框架的情况下执行上述测试,例如命令“pytest test_foo.py”
  • 我使用的是较低版本的 Firefox,所以我没有使用页面加载策略 profile.setPreference("webdriver.load.strategy", "unstable");这解决了我的问题 1,即在页面加载完成之前获得返回。但是我遇到的问题是仅在页面加载完成时才开始查找 elemet,所以我想通过动作链发送转义键,但无法做到这一点和窗口。停止();也没有用。我使用的是 firefox 28 和 selenium 2.41
最近更新 更多