【问题标题】:How to take screenshot of a newly loaded webpage如何截取新加载的网页的屏幕截图
【发布时间】:2019-11-29 04:58:13
【问题描述】:

我正在使用 selenium 登录网页并在登录后截取屏幕截图。这是我的代码:

import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
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("some website")
user_name = driver.find_element_by_name("USERNAME")
password = driver.find_element_by_name("PIN")

user_name.clear()
user_name.send_keys("username")

password.clear()
password.send_keys("password)

###Sends enter
password.send_keys(Keys.RETURN)

# Wait for some time for the next page to load
wait = WebDriverWait(driver, 10)

driver.save_screenshot('screenshot.png')
driver.quit()

当我这样做时,我得到的是登录页面的屏幕截图,而不是下一页。

理想的预期输出应该是页面的屏幕截图,登录后。 我已经通过监控 selenium 打开网页、登录、 10 秒内。

所以我做了其他事情,我插入了 sleep (10) 而不是 driver.wait,如下所示:

wait = WebDriverWait(driver, 10)                   

替换为

os.sleep(10)

执行此操作后,我得到了下一页的屏幕截图。

然后我还尝试插入自定义等待条件,并在下一页中搜索一个元素:

try:
    element = WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.ID, "crnum"))
    )

但是,硒给了我以下错误:

TimeoutException                          Traceback (most recent call last)
<ipython-input-39-16f1ee0dd7f3> in <module>()
     15 try:
     16     element = WebDriverWait(driver, 100).until(
---> 17         EC.presence_of_element_located((By.ID, "crnum"))
     18     )
     19 finally:

D:\anaconda\lib\site-packages\selenium\webdriver\support\wait.py in until(self, method, message)
     78             if time.time() > end_time:
     79                 break
---> 80         raise TimeoutException(message, screen, stacktrace)
     81 
     82     def until_not(self, method, message=''):

TimeoutException: Message: 

我已经检查了第二页,并且 id 存在那里。 我相信发生的事情是 selenium 仍在尝试搜索加载页面上的元素。

我通过监控另一个页面手动验证,它在两秒钟内打开。

编辑:

Html 代码出现在第二页,我正在按 id 搜索:

<input type="text" id="crnum" name="number" title="Request Number" onfocus="this.className='focusField';" onblur="this.className='';" class="">

【问题讨论】:

  • 我在您的代码中没有看到 element = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.ID, "crnum"))) 行
  • @Andersson 已编辑问题。
  • @avinash 使用您标识为(By.ID, "crnum")的元素的HTML 更新问题
  • @avinash wait = WebDriverWait(driver, 10) 不是等待页面加载。这条线实际上什么都不做
  • @Andersson 然后我如何等待下一页加载。

标签: python selenium selenium-webdriver screenshot webdriverwait


【解决方案1】:

要获得 Next Page(新加载的页面)的屏幕截图,您必须诱导 WebDriverWait 以使下一页上已识别的元素可点击,您可以使用以下代码块:

password.send_keys(Keys.RETURN)
# Wait for the element with text as Request Number to be clickable
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='crnum' and @name='number' and @title='Request Number']")))
driver.save_screenshot('screenshot.png')
driver.quit()

参考

您可以在How to take screenshot with Selenium WebDriver找到详细讨论

【讨论】:

  • 我添加了可点击的行,但我仍然收到错误消息。出于某种原因,selenium 仍在搜索旧页面而不是新加载的页面。
  • 先删除现有附件。执行你的程序。刷新您的项目空间并重新审视快照。
  • 嗨,Debanjan 做了上述操作,错误仍然存​​在。我可以通过在截屏前输入 time.sleep(4) 来截屏。不知道发生了什么。
  • 你能分享 url 以防它是公共 url 吗?
  • 这是公司内部网址,我希望我可以分享它,因为我真的想调试它。你能解释一下为什么检查 elements_to_be_clickable 比 presense_of_elements_locatable 更好/更准确吗?
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 2017-04-04
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多