#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/…