我想在以下网站输入用户名和密码:
https://www.thegreatcoursesplus.com/sign-in
driver = webdriver.Chrome()
driver.get('https://www.TheGreatCoursesPlus.com/sign-in')
driver.find_element_by_xpath('//h1[@class="sign-in-input"]').click()
这给出了以下例外:
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
然后我尝试使用java脚本:
driver.execute_script("document.getElementsByClassName('sign-in-input')[0].click()")
cmd = "document.getElementsByClassName('label-focus')[0].value = 'abc@abc.com'"
driver.execute_script(cmd)
没有错误,但没有文字发送到"电子邮件地址"领域。
有人可以指导我输入电子邮件地址,密码的正确方法,然后点击"登录"。
感谢您提供帮助
3 个答案:
答案 0 :(得分:2)
此错误消息...
selenium.common.exceptions.ElementNotVisibleException:消息:元素不可见
...表示当WebDriver实例试图找到它时,HTML DOM中不可见所需的元素。
ElementNotVisibleException
当DOM树上存在元素时抛出ElementNotVisibleException,但它不可见,因此无法与之交互。
原因
一个可能消除ElementNotVisibleException的事实是WebElement存在于HTML中,并且在尝试单击()或读取从视图中隐藏的元素的属性时通常会遇到此异常。
解
由于ElementNotVisibleException确保WebElement存在于HTML中,因此前面的解决方案将按照以下详细步骤进行两次折叠:
如果下一步是读取所需元素的任何属性,则需要将WebDriverWait与设置为visibility_of_element_located的expected_conditions子句结合使用,如下所示:
来自selenium.webdriver.support.ui导入WebDriverWait
来自selenium.webdriver.common.by导入
从selenium.webdriver.support导入expected_conditions作为EC
my_value = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH," element_xpath")))。get_attribute(" innerHTML")
如果您下一步是在所需元素上调用click(),那么您需要将WebDriverWait与设置为element_to_be_clickable的expected_conditions子句结合使用,如下所示:
来自selenium.webdriver.support.ui导入WebDriverWait
来自selenium.webdriver.common.by导入
从selenium.webdriver.support导入expected_conditions作为EC
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH," element_xpath")))。click()
这个用例
您构造为// h1 [@class =" sign-in-input"]的xpath与任何节点都不匹配。我们需要创建唯一的xpath来定位代表电子邮件地址,密码和登录按钮的元素,从而导致WebDriverWait。下面的代码块将帮助您实现相同的目标:
来自selenium import webdriver
来自selenium.webdriver.chrome.options导入选项
来自selenium.webdriver.support.ui导入WebDriverWait
来自selenium.webdriver.common.by导入
从selenium.webdriver.support导入expected_conditions作为EC
options =选项()
options.add_argument("起动最大化&#34)
options.add_argument("禁用-信息栏&#34)
options.add_argument(" - 禁用的扩展&#34)
driver = webdriver.Chrome(chrome_options = options,executable_path =" C:\\ Utility \\ BrowserDrivers \\ chromedriver.exe")
driver.get(' HTTPS://www.TheGreatCoursesPlus.com/sign-in')
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH," // div [@id =' modal'] //输入[@name =' email& #39;]")))send_keys(" abc@abc.com")
driver.find_element_by_xpath(" // DIV [@id ='模态'] //输入[@name ='密码']&#34)。send_keys(&# 34;密码&#34)
driver.find_element_by_xpath(" // div [@id =' modal'] //按钮[@class =' color-site sign-in-button']&#34 ;)点击()。
答案 1 :(得分:0)
用于用户名:
driver.find_element_by_xpath("//input(@type='email')").click()
driver.find_element_by_xpath("//input(@type='email')").send_keys( "username" )
密码使用
:
driver.find_element_by_xpath("//input(@type='password')").click()
driver.find_element_by_xpath("//input(@type='password')").send_keys( "password" )
答案 2 :(得分:0)
有两个问题:
- 第一个是计时,表单显示需要一些时间。您可以使用显式等待来解决它。
- 第二个是
<input>
标记中的字段ID,而不是<h1>
标记,并且有许多字段与此xpath匹配。我建议您找到包含字段的表单并使用它来查找每个字段
对于计时问题,您可以使用显式等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.TheGreatCoursesPlus.com/sign-in')
form = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//div[@class="modal-body"]//form')))
form.find_element_by_name('email').send_keys(email)
form.find_element_by_name('password').send_keys(password)
form.find_element_by_name('sign-in-button').click()