它已经是众所周知的bug,通常它有三种方法可以避免它:检查重叠,设置睡眠时间到完全页面下载,检查元素的可见性。 我尝试了所有这些,但他们没有工作。 好: 我正在使用twitter页面 https://api.twitter.com/oauth/authenticate?oauth_token=3b8ougAAAAAABl35AAABWpZgqDA 文本filds有HTML:
<label for="username_or_email" tabindex="-1">Username or email</label>
<input aria-required="true" autocapitalize="off" autocorrect="off" autofocus="autofocus" class="text" id="username_or_email" name="session[username_or_email]" type="text" value="">
我试过代码:
def input_label:
links = get_driver().find_elements_by_xpath("//label[@for='username_or_email']")
if links:
links[0].send_keys(str(UserName))
else:
raise ValueError('Field with label for username_or_email not found')
我绑了代码:
def input_id:
links = get_driver().find_elements_by_xpath("//input[@id='username_or_email']")
if links:
links[0].send_keys(str(UserName))
else:
raise ValueError('Field with id username_or_email not found')
我在send_keys之前单击此elemrnt尝试了它,没有。但我所有的解决方案都没有用。我总是有一条错误消息“元素在点上无法点击......”。 有什么建议吗?
答案 0 :(得分:0)
您首先尝试将文字发送到标签。你是第二次尝试是在正确的轨道上。但是,id
元素没有input
属性。将id
更改为name
,然后将links[0].send_keys()
更改为links[1].send_keys()
:
def input_id:
links = get_driver().find_elements_by_xpath("//input[@name='username_or_email']")
if links:
links[1].send_keys(str(UserName))
else:
raise ValueError('Field with id username_or_email not found')
编辑:澄清一下,我发现你发布的HTML中有一个id
属性,但它在我能够找到的Twitter登录元素中不存在。
编辑2:如果在脚本尝试填写凭据之前问题与未完全加载的元素有关,请尝试使用WebDriverWait
。一个例子是:
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome([path to your chromedriver])
# code that navigates to wherever you are going...
WebDriverWait(driver, 10).until(expected_conditions.visibility_of_element_located((By.XPATH, "//input[@name='username_or_email']")))
# ^ this is how many seconds you want to wait
links = get_driver().find_elements_by_xpath("//input[@id='username_or_email']")
if links:
links[0].send_keys(str(UserName))
else:
raise ValueError('Field with id username_or_email not found')