尝试登录OneDrive网页时出现Selenium NoSuchElementException(尝试了其他定位元素)

时间:2019-05-06 07:51:40

标签: python selenium nosuchelementexception

我计划编写一个脚本,以使用Selenium自动登录OneDrive网页。 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 :(得分:0)

您要访问的元素位于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