我正在尝试自动登录https://auth.tesla.com/login,但在尝试输入我的电子邮件地址时遇到了麻烦。
我尝试了以下Python代码行:
toPyObject
或email_box = driver.find_element_by_xpath("//form[1]")
关注了email_box = driver.find_element_by_link_text('Email')
但是我收到错误消息email_box.clear()'
,这表明我没有找到正确的元素。我的问题:
有没有一种方法可以确定Element must be user-editable in order to clear it
代码找到了哪个html元素?
或者,也许有更好的方法来找到电子邮件框并输入我的电子邮件地址?
(我正在使用Raspbian Buster使用Selenium 3.141.0和Chromium 74.0.3729.157进行此操作)。谢谢!
答案 0 :(得分:0)
如果您想可视化页面上选定的元素,则选择后可以在其上应用一些JS,以便可以看到获得的元素(用于调试)
email_box = driver.find_element_by_xpath(“ // form [1]”) driver.execute_script('arguments [0] .setAttribute(“ style”,“颜色:红色;边框:2px纯红色;”)',email_box)
driver.find_element_by_link_text('Email')
:这是错误的,因为此页面上没有文本为“ email”的LINK(LINK元素是元素)。您也无法清除元素。通常clear
应用于输入。
driver.find_element_by_xpath("//form[1]")
:这是错误的,因为在这里您将获得页面上的第一个
您正在寻找的是:css选择器:
form#login-form输入[placeholder ='Email']
或xpath
//form[@id='login-form']//input[@placeholder='Email']
答案 1 :(得分:0)
您的代码行email_box = driver.find_element_by_xpath(“ // form [1]”)查找表单,而不是输入字段。您可以使用WebElement属性和方法进行检查:
示例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
email_box = driver.find_element_by_xpath("//form[1]")
print(email_box.text)
输出:
'Sign In\nI forgot my password\nSIGN IN\nCreate an account'
这就是您的browser.find_element_by_xpath(“ // form [1]”)找到的东西。
有很多方法可以访问此电子邮件字段并对其进行测试。
如果确定该网页将保持不变,则可以在该输入字段中使用XPATH:
xp='/html/body/div[2]/div/form/div[1]/div/div[2]/input'
email_box = driver.find_element_by_xpath(xp)
email_box.send_keys('Test')
另一种方法是收集所有输入并识别它们。这比直接查找和使用电子邮件字段更能了解什么。 :
input_list = driver.find_elements_by_class_name("input")
for field in input_list:
print(input_list.index(i), i.get_attribute('placeholder'))
输出:
0 Username
1 Email
2 Password
因此,您现在知道有3个输入字段,第二个是电子邮件,然后输入密码。假设该页面保持不变,您现在可以在其中填充文本:
input_list[1].send_keys('email@email.com')
input_list[2].send_keys('Secret_password')
您还可以在输入中编写一些自己的内容,然后尝试检测值(前面的代码中已经包含测试内容):
xp='/html/body/div[2]/div/form/div[1]/div/div[2]/input'
email_box = driver.find_element_by_xpath(xp)
email_box.get_attribute('value')