在 python 中使用 PhantomJS 时网页尚未完全加载时截取屏幕截图
Screenshots are taken when the webpages have yet fully loaded when using PhantomJS in python
使用PhantomJs & Python绑定截屏时出现问题,我截取的一些图片没有完全加载。
我尝试使用 driver.implicitly_wait(5)
来解决它,但没有成功。
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("https://world.taobao.com")
driver.save_screenshot('x.png')
有人知道吗?
usingdriver.implicitly_wait(5)
将对页面中存在的所有元素应用一次,最多持续 5 秒,如果元素需要更长的时间,则不够。请注意,它也只需编写一次。
您可以使用 time
模块添加 time.sleep(10)
或类似的等待时间(如果您确定图像完全加载需要多长时间),或者使用显式等待。
导入以下内容
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
假设您拥有要确保可见的元素的定位器,并希望在此示例中使用 XPath 定位它(以防返回的元素有多个循环)
locator = (By.XPATH,"SOME_VALID_XPATH")
定义一个变量来保存 WebDriverWait
对象,如下所示:
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located(locator))
这个问题可能是图像可以有尺寸,因此被认为是加载和可见的。一种解决方法是存储图像并断言加载的图像与它们相等,这对于简单的情况来说是一个相当复杂的解决方案。
我建议使用 time
模块或显式等待。
我发现解决这个问题的方法是执行一个JS脚本滚动整个页面:
from selenium import webdriver
import time
def take_screenshot(url, save_fn="capture.png"):
browser = webdriver.Chrome()
# browser = webdriver.PhantomJS()
browser.set_window_size(1200, 900)
browser.get(url)
# scroll down to the bottom and scroll back to the top
browser.execute_script("""
(function () {
var y = 0;
var step = 100;
window.scroll(0, 0);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100);
} else {
window.scroll(0, 0);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
})();
""")
for i in range(30):
if "scroll-done" in browser.title:
break
time.sleep(10)
print(i)
browser.save_screenshot(save_fn)
browser.close()
if __name__ == "__main__":
take_screenshot("http://world.taobao.com")
感谢这篇原创post:https://cloud.tencent.com/developer/article/1406656
使用PhantomJs & Python绑定截屏时出现问题,我截取的一些图片没有完全加载。
我尝试使用 driver.implicitly_wait(5)
来解决它,但没有成功。
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("https://world.taobao.com")
driver.save_screenshot('x.png')
有人知道吗?
usingdriver.implicitly_wait(5)
将对页面中存在的所有元素应用一次,最多持续 5 秒,如果元素需要更长的时间,则不够。请注意,它也只需编写一次。
您可以使用 time
模块添加 time.sleep(10)
或类似的等待时间(如果您确定图像完全加载需要多长时间),或者使用显式等待。
导入以下内容
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
假设您拥有要确保可见的元素的定位器,并希望在此示例中使用 XPath 定位它(以防返回的元素有多个循环)
locator = (By.XPATH,"SOME_VALID_XPATH")
定义一个变量来保存 WebDriverWait
对象,如下所示:
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located(locator))
这个问题可能是图像可以有尺寸,因此被认为是加载和可见的。一种解决方法是存储图像并断言加载的图像与它们相等,这对于简单的情况来说是一个相当复杂的解决方案。
我建议使用 time
模块或显式等待。
我发现解决这个问题的方法是执行一个JS脚本滚动整个页面:
from selenium import webdriver
import time
def take_screenshot(url, save_fn="capture.png"):
browser = webdriver.Chrome()
# browser = webdriver.PhantomJS()
browser.set_window_size(1200, 900)
browser.get(url)
# scroll down to the bottom and scroll back to the top
browser.execute_script("""
(function () {
var y = 0;
var step = 100;
window.scroll(0, 0);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100);
} else {
window.scroll(0, 0);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
})();
""")
for i in range(30):
if "scroll-done" in browser.title:
break
time.sleep(10)
print(i)
browser.save_screenshot(save_fn)
browser.close()
if __name__ == "__main__":
take_screenshot("http://world.taobao.com")
感谢这篇原创post:https://cloud.tencent.com/developer/article/1406656