【问题标题】:Element is not clickable at point. Chrome. Webdriver. Python元素不可点击。铬合金。网络驱动程序。 Python
【发布时间】:2017-07-24 05:24:57
【问题描述】:

这是一个众所周知的bug,通常它有三种方法来避免它:检查重叠,设置睡眠时间以完全下载页面,检查元素的可见性。 我尝试了所有这些,但它们都不起作用。 好吧: 我正在使用 twitter 页面 https://api.twitter.com/oauth/authenticate?oauth_token=3b8ougAAAAAABl35AAABWpZgqDA 文本字段具有 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 之前单击此 elemnt,但没有尝试。但是我所有的解决方案都不起作用。我总是收到一条错误消息“元素无法点击...”。 有什么建议吗?

【问题讨论】:

    标签: python google-chrome selenium xpath


    【解决方案1】:

    您第一次尝试将文本发送到标签。你的第二次尝试是在正确的轨道上。但是,input 元素没有 id 属性。将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')
    

    【讨论】:

    • 感谢您的意见。澄清一下:我的 xpath 没有问题,我在控制台中检查了它,它与我使用 name 属性的元素相同。并且 100% 我不能使用 links[1].send_keys(str(UserName)) 因为我的列表只有一个元素并且它的索引为 0(它的列表元素编号:first-0,second - 1 ... 等等)。
    • 明白了。我修改并针对 twitter 登录页面对其进行了测试,该页面有效。我这样做是因为我们无法访问您提供的链接,所以我们没有什么可反对的。
    • 谢谢。你用的是哪个浏览器?您可以使用任何使用 twitter api(例如:buffer.com)的应用程序登录以访问我拥有的页面。由于令牌已过期,页面无法访问。
    • 我使用 Chromedriver 对 Chrome 进行了测试,因为您已标记了 google-chrome。我没有意识到您正在使用它来使用 3rd 方 Twitter 身份验证。我会进行一些测试,看看我能不能弄明白。
    • hmm,使用 buffer.com 和您在第二次尝试中提供的原始代码 (find_elements_by_xpath("//input[@id='username_or_email']")),我执行代码没有问题。在脚本尝试执行之前元素是否有可能尚未完全加载?如果是这样,您可以使用 WebDriverWait 功能来查看是否有帮助。我编辑了我的帖子以包含此示例代码。
    猜你喜欢
    • 2014-11-30
    • 2012-11-19
    • 1970-01-01
    • 2023-03-15
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多