我正在捕获网页,但我希望脚本在捕获它之前应该等待一段时间,因为我现在正在使用 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)
等待页面完全加载的唯一可靠方法是使用 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 请求花费的时间超过预期时,处理可能会在页面加载之前继续。如果您使用较长的 sleep 时间,那么您就浪费了不必要的等待时间。
我是一名优秀的程序员,十分优秀!