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

Python 如何让脚本等待一段时间,以便加载来自ajax响应的数据,然后捕获网页,python,ajax,selenium,selenium-webdriver,phantomjs,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/loca

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

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

Thread.sleep(5000); 


假设在最坏的情况下,加载Ajax数据需要20秒。尽管我们为Web元素分配了20秒,但一旦加载Ajax数据,执行将进入下一步,完全避免不必要的等待

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

Thread.sleep(5000); 


假设在最坏的情况下,加载Ajax数据需要20秒。尽管我们为Web元素分配了20秒,但一旦加载Ajax数据,执行将进入下一步,完全避免不必要的等待

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

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

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


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

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

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

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


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

当Ajax需要5.1秒时会发生什么?@RobbieWareham:毫无疑问,它将在不加载Ajax数据的情况下捕获屏幕,并将导致失败。我在上面的答案中更新了另一个最好的选择。请让我知道,如果我们有更多的首选选项,然后这个。感谢使用WebDriverWait比显式线程要好得多。Sleep当Ajax需要5.1秒时会发生什么?@RobbieWareham:毫无疑问,它将在不加载Ajax数据的情况下捕获屏幕,并将导致失败。我在上面的答案中更新了另一个最好的选择。请让我知道,如果我们有更多的首选选项,然后这个。感谢使用WebDriverWait比显式线程要好得多。sleep
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()