我计划编写一个脚本,以使用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")
这些也产生了相同的错误。
根据我在网上找到的信息,我非常确定这是正确的方法。 网页可能会阻止自动登录吗?
非常感谢您的帮助。
亲切的问候 帕斯卡
答案 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