2017-06-12 459 views
1

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

+0

现在你为什么会做这样的事情,让我们说你等待一个按钮来显示。一旦按钮显示你做任何你想做的事情,它不会等待页面在它执行你的命令之前完全加载,除非你有这样的一个替代原因,这是没用的。 –

+0

@ElvirMuslic但是,只有当页面完成加载后,才会调用driver.get()。这就像我想以编程方式点击该按钮,一旦按钮可见不等待整个页面加载。 – RamKumar

+0

并非如此,driver.get()只是使请求不会等待元素加载。如果你说driver.something.click(),它会在它获得关于该页面的任何响应后立即执行它,如果该元素不存在,则会引发错误。 含义,1.driver.get()等待来自页面的任何响应(不是全部)。 2.您可以执行任何您想要的内容,并且该页面不必完全加载,但会在执行这些操作时加载。 3.这可以用来节省时间和使用我想以某种方式(对于大型项目) –

回答

5

是的,可以将pageLoadStrategy的能力设置为none。然后等待一个元素存在,并呼吁​​停止加载:

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://stackoverflow.com/') 

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

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

如果我想在本地执行此代码,我需要在本地执行什么操作?我理解依赖关系的要求,但是我需要在上述测试中指向一个chromedriver吗?你如何在没有语言绑定的情况下执行上述操作? – Wunderbread

+0

@Wunderbread,我不确定“没有语言绑定”是什么意思,但是要在本地执行代码,可以将chromedriver放在'PATH'环境变量中,或者将路径提供给构造函数('webdriver.Chrome ')。 –

+0

明白了,谢谢。我的意思是在没有框架的情况下执行上述测试。命令“pytest test_foo.py” – Wunderbread

相关问题