如何使脚本等待一段时间,以便加载来自ajax响应的数据,然后捕获网页

1 python ajax selenium phantomjs selenium-webdriver

我正在捕获网页,但我希望脚本在捕获之前应该等待一段时间,因为我现在正在使用AJAX填充一些数据,脚本没有等待并在ajax数据加载之前捕获网页.

我正在使用以下代码.

import blockspring
from selenium import webdriver
import time
import json

def screenshot(request, response):
  driver = webdriver.PhantomJS(executable_path='/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs')
  driver.set_window_size(request.params["width"] or 1024, request.params["height"] or 768) # optional
  driver.implicitly_wait(30) # seconds
  driver.get(request.params["url"])
  driver.save_screenshot('my_screenshot.png')
  response.addFileOutput("screenshot", "my_screenshot.png")
  response.end()


blockspring.define(screenshot)
Run Code Online (Sandbox Code Playgroud)

Art*_* B. 6

等待页面完全加载的唯一可靠方法是使用显式等待.当有AJAX请求时,他们会在页面中更改某些内容.所以你需要等待这些变化发生.您必须确定将哪个元素添加(或删除)到页面作为最后一个元素,确定该元素的选择器是什么并等待它.

这是文档中的示例(它与PhantomJS的工作方式相同):

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()
Run Code Online (Sandbox Code Playgroud)

此代码等待10秒,直到出现错误.您可以使用此时间指定站点加载或执行某些操作的可接受时间.如果它没有及时完成并且测试用例失败,您知道该站点太慢并且必须进行优化或者站点已经更改并且您必须进行调整.它也可能是网络错误和其他一百万个问题.

静态使用sleep方式更容易添加,但可能会导致意外结果.当AJAX请求花费的时间超过预期时,处理可能会在页面加载之前继续.如果你使用很长的睡眠时间,那么你就可以节省不必要的时间.