Как сделать скриншот только что загруженной веб-страницы

Я использую селен, чтобы войти на веб-страницу и сделать снимок экрана после входа в систему. Вот мой код:

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()

Когда я это делаю, я получаю скриншот страницы входа вместо следующей страницы.

Ожидаемый результат в идеале должен быть скриншотом страницы, после входа в систему. Я вручную проверил, отслеживая, что селен открывает веб-страницу, входит в систему в течение 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: 

Я проверил вторую страницу, и там существует идентификатор. Я считаю, что происходит то, что селен все еще пытается найти элемент на странице загрузки.

Я вручную проверил, отслеживая другую страницу, и она открывается менее чем за две секунды.

ИЗМЕНИТЬ:

Html-код присутствует на второй странице, я ищу по идентификатору:

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

person avinash    schedule 15.05.2018    source источник
comment
Я не вижу строки element = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.ID, "crnum"))) в вашем коде   -  person Andersson    schedule 15.05.2018
comment
@Andersson Отредактировал вопрос.   -  person avinash    schedule 15.05.2018
comment
@avinash Обновите вопрос, указав HTML-код элемента, который вы идентифицировали как (By.ID, "crnum").   -  person DebanjanB    schedule 15.05.2018
comment
@avinash wait = WebDriverWait(driver, 10) - это не ожидание загрузки страницы. Эта строка на самом деле ничего не делает   -  person Andersson    schedule 15.05.2018
comment
@Andersson Как мне дождаться загрузки следующей страницы.   -  person avinash    schedule 15.05.2018
comment
@DebanjanB Я обновил html-код, присутствующий на второй странице. Также, когда я добавляю sleep(10) в свой код, я получаю снимок экрана второй страницы.   -  person avinash    schedule 15.05.2018


Ответы (1)


Чтобы получить снимок экрана Следующей страницы (только что загруженной страницы), вы должны вызвать 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()

Справка

Вы можете найти подробное обсуждение в Как сделать снимок экрана с помощью Selenium WebDriver.

person DebanjanB    schedule 15.05.2018
comment
Я добавил интерактивную строку, но все еще получаю сообщение об ошибке. По какой-то причине селен все еще ищет старую страницу, а не только что загруженную страницу. - person avinash; 15.05.2018
comment
Сначала удалите существующее вложение. Выполните свою программу. Обновите свое Project Space и по-новому взгляните на снимок. - person DebanjanB; 15.05.2018
comment
Привет, Дебанджан сделал вышеописанное, ошибка по-прежнему сохраняется. Я могу сделать снимок экрана, установив time.sleep(4) перед тем, как сделать снимок экрана. Не знаю, что происходит. - person avinash; 15.05.2018
comment
Можете ли вы поделиться url, если это общедоступный url? - person DebanjanB; 15.05.2018
comment
Это внутренний URL-адрес компании, я хотел бы поделиться им, так как я действительно хочу его отладить. Можете ли вы объяснить, почему проверка elements_to_be_clickable лучше/точнее, чем presense_of_elements_locatable? - person avinash; 15.05.2018
comment
@avinash Проверьте это обсуждение WebDriverWait not working as expected - person DebanjanB; 15.05.2018