无法在我的脚本中应用显式等待

时间:2017-09-11 13:46:18

标签: python python-3.x selenium selenium-webdriver web-scraping

我在python中编写了一个脚本来从缓慢加载的网页中删除名称。该页面中有1000个名称,只有在浏览器向下滚动时才能加载完整内容。但是,我的脚本可以成功到达此页面的最低部分并解析所有名称。我在这里遇到的问题是我在这种情况下使用了5秒的硬编码延迟,这使得浏览器不必等待即使加载项目也是如此。那么我如何使用显式等待来克服这种情况并解析所有项目。

这是我到目前为止编写的脚本:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://fortune.com/fortune500/list/")

check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)
    height = driver.execute_script("return document.body.scrollHeight;") 
    if height == check_height: 
        break 
    check_height = height

    listElements = driver.find_elements_by_css_selector(".company-title")

for item in listElements:
    print(item.text)

2 个答案:

答案 0 :(得分:1)

您可以添加明确等待,如下所示:

from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://fortune.com/fortune500/list/")

check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    try:
        WebDriverWait(driver, 10).until(lambda driver: driver.execute_script("return document.body.scrollHeight;")  > check_height)
        check_height = driver.execute_script("return document.body.scrollHeight;") 
    except:
         break


listElements = driver.find_elements_by_css_selector(".company-title")
for item in listElements:
    print(item.text)

这应该允许您避免硬编码time.sleep() - 相反,您只是等待更改height值或者在滚动后经过10秒后height不变的情况下中断循环。 ..

答案 1 :(得分:0)

您需要使用显式等待,如下所示:

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

此处有更多详情http://selenium-python.readthedocs.io/waits.html