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

时间:2014-11-29 18:54:02

标签: python ajax selenium selenium-webdriver phantomjs

我正在捕获网页,但我希望脚本在捕获之前应该等待一段时间,因为我现在正在使用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)

2 个答案:

答案 0 :(得分:6)

等待页面完全加载的唯一可靠方法是使用explicit waits。当有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()

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

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

答案 1 :(得分:0)

仅在加载Ajax数据后才捕获屏幕。您可以根据需要设置手动等待时间。假设你希望你的脚本等待5秒。所以只需在脚本中包含此命令即可暂停。

Thread.sleep(5000); 

WebDriverWait wait_for_Data = new WebDriverWait(driver, 20);
wait_for_Data.until(ExpectedConditions.elementToBeClickable(By.--("Our Ajax Data Loading Condition")));

让我们说在最糟糕的情况下,我们的Ajax数据需要20秒才能完成Load.Even虽然我们为我们的Web元素分配了20秒,但只要Ajax Data加载完全避免不必要的等待,执行就会进入下一步。