Selenium NoSuchElementException при попытке входа на веб-страницу OneDrive (пробовали разные элементы размещения) - PullRequest
0 голосов
/ 06 мая 2019

Я планирую написать скрипт для автоматизации входа на веб-страницу OneDrive с помощью Selenium.Версия Google Chrome и Chromedriver - 74. Я всегда сталкиваюсь с NoSuchElementException и не знаю почему.Для других приложений, кроме входа в систему, у меня не было проблем с использованием Selenium и настройки Chrome.

HTML-код поля ввода электронной почты должен быть следующим:

<input type="email" class="form-control" aria-required="true" aria-label="E-Mail, Telefon oder Skype" placeholder="E-Mail, Telefon oder Skype" data-bind="hasFocus: focus, textInput: email, attr: {'placeholder': config.text.emailPlaceHolder,
                            'aria-label': config.text.emailPlaceHolderAria, 'aria-invalid': !error}" spellcheck="false" autocomplete="off">

Код выглядит следующим образом:

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get("https://onedrive.live.com/about/de-ch/signin/") 
time.sleep(10)

email = browser.find_element_by_xpath("/html/body/div[2]/div/main/div[2]/div[4]/div/input")
email.send_keys("test")

Выше XPath использовался для поиска фрагмента HTML, который был непосредственно скопирован из Chrome.Это приводит к следующей ошибке:

NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[2]/div/main/div[2]/div[4]/div/input"}

  (Session info: chrome=74.0.3729.131)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17763 x86_64)

Другие подходы к поиску фрагмента html были:

username = browser.find_element_by_class_name("form-control")
username = browser.find_element_by_css_selector("input.form-control")

Они также вызывали ту же ошибку.

С тем, что я нашелонлайн, я совершенно уверен, что это правильный путь.Может ли веб-страница блокировать автоматический вход в систему?

Большое спасибо за вашу помощь.

С уважением, Паскаль

1 Ответ

0 голосов
/ 06 мая 2019

Элемент, к которому вы пытаетесь получить доступ, находится внутри iframe.Вам нужно переключиться на фрейм, прежде чем вы получите доступ к элементам внутри.

Попробуйте это:

wait = WebDriverWait(driver,30)
driver.get("https://onedrive.live.com/about/de-ch/signin/")

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME,"SignIn")))

email = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div.form-group > input.form-control")))
email.send_keys("test@etst.test")

Чтобы использовать WebDriverWait, вам необходимо импортировать следующее

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