Selenium ChromeDriver не взаимодействует с диалогом печати Chrome

#python #selenium

Вопрос:

Я новичок в веб-скребке, и недавно я попытался создать веб-скребок, который распечатывает мой онлайн-календарь. Я смог понять, как получить приглашение на печать с помощью Selenium, но я не могу взаимодействовать с фактическим окном печати, когда пытаюсь программно нажать кнопки Печать и отмена.

Запрос на печать загружается за секунду или две, и у меня уже есть окно печати, выбранное в качестве текущего окна Webdriver (выполняется с помощью приведенного ниже кода).

 whandles = driver.window_handles
print("About to switch window handle to print window, should be: "   whandles[1])
driver.switch_to.window(whandles[1])
 

Но когда я пытаюсь:

 printBtnFinal = WebDriverWait(driver,100).until(EC.element_to_be_clickable((By.CLASS_NAME,'action-button'))).click()
 

ничего не происходит, время ожидания программы истекает (я предполагаю, потому что элемент так и не был найден).

Как я могу успешно взаимодействовать с окном печати Chrome? Мы будем признательны за любую помощь.

Комментарии:

1. Chrome Print Window как мне это открыть ?

2. Если вы используете календарь Google или Outlook, они обычно переопределяют календарь с помощью отдельного экрана печати. Я использую Outlook, и когда я нажимаю » Печать » в правом верхнем углу календаря Outlook, я попадаю на экран конфигурации. Если я снова нажму » Печать » на этом экране, я, наконец, попаду в окно печати Chrome .

3. Должно быть, я что-то упускаю, у меня открыт outlook в моем Google Chrome, но я все еще не могу понять, где печать в outlook ?

4. Вы находитесь в календаре Outlook?

5. Нет, я на https://outlook.office.com/mail/inbox

Ответ №1:

Объяснение проблемы

В этом нет необходимости switch to Print Modal pop up . Потому new windows/tab что это не то, в чем оно находится frame . Так что в этом виновато переключение.

Решение

Я бы рекомендовал вам использовать WebDriverWait явное ожидание в Selenium библиотеке.

для того, чтобы click на Print котором находится в правом верхнем углу, используйте это xpath и code :

 wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Print']/ancestor::button"))).click()
 

Как только вы нажмете на это, вы увидите символ new pop up с Print и Cancel button .

чтобы нажать на печать во всплывающем окне, приведенный ниже код должен помочь вам решить проблему, с которой вы столкнулись.

 wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Print']/ancestor::button[contains(@class,'action')]"))).click()
 

Импорт :

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 

Обновление 1 :

 driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(50)
driver.get("https://outlook.live.com/owa/?state=1amp;redirectTo=aHR0cHM6Ly9vdXRsb29rLmxpdmUuY29tL2NhbGVuZGFyLwamp;nlp=1")
wait = WebDriverWait(driver, 20)

#User Must place Email:
USER_EMAIL = 'user name should be given here'
USER_PASSWORD = 'password should be here'

emailField = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input[type='email']")))
emailField.clear()
emailField.send_keys(USER_EMAIL)
submitEmail= WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input[type='submit']"))).click()
#Dismiss "It looks like this email is used with more than one account from Microsoft" screen
#personalAccount = WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div[id='msaTile']"))).click()

#Enter Password
passwordField = WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input[type='password']")))
passwordField.clear()
passwordField.send_keys(USER_PASSWORD)
submitPassword = WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input[type='submit']"))).click()

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.table-row"))).click()
time.sleep(30)

wait.until(EC.element_to_be_clickable((By.ID, "idSubmit_SAOTCC_Continue"))).click()
#Dismiss StaySignedIn
staySignedIn = WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input[id='idBtn_Back']"))).click()

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[title='Calendar']"))).click()
printBtn1 = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Print']/ancestor::button"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Print']/ancestor::button[contains(@role,'menuitem')=false]"))).click()
 

Комментарии:

1. Странно, я только что попробовал то, что вы сказали: WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Print']/ancestor::button[contains(@class,'action')]"))).click() сразу после открытия всплывающего окна печати и все еще не печатаю/нажимаю.

2. было ли какое-нибудь исключение ?

3. Да, вот исключение: AttributeError: 'NoneType' object has no attribute 'is_displayed'

4. Это не правильная трассировка стека ошибок для моего кода, у вас тоже должно быть is_displayed что-то еще в вашем коде, и это вызывает сбой

5. drive.google.com/file/d/1HXTbrY7Tj5J9ixXTxcfJaAm_tI4jB4ma/…