无法使用selenium python

时间:2017-10-15 18:39:54

标签: python selenium

我正在制作一个登录网站并执行一些按钮点击的脚本。虽然不是那么难,但我已经为其他网站做过这个,但是这个网站似乎有动态ID,这让我很难找到这些字段。当我刷新页面时,id会改变,但它确实有一些不会改变的文本。我搜索了stackoverflow并找到了一些我尝试过但没有工作的代码。代码什么都不做,浏览器就关闭了。我试过chrome和firefox都做同样的事情。我是python selenium plz帮助的新手。 这是页面

https://www.quora.com/

driver.find_element_by_name("email")
  

driver.find_elements_by_xpath(' // * [包含(@id,"电子邮件")]')。send_keys(' ssss')

<input class="text header_login_text_box ignore_interaction" name="email" tabindex="1" data-group="js-editable" placeholder="Email" w2cid="IDHg1fF" id="__w2_IDHg1fF_email" type="text">
<input class="text header_login_text_box ignore_interaction" name="password" tabindex="2" data-group="js-editable" placeholder="Password" w2cid="IDHg1fF" id="__w2_IDHg1fF_password" type="password">

我如何定位这两个字段?因为他们确实有一个在id结尾的文本。但数字不断变化。

2 个答案:

答案 0 :(得分:1)

问题是有两个元素与您的定位器匹配,第一个元素不可见。有几种方法可以解决这个问题。

  1. 使用第二个

    driver.find_elements_by_name("email")[1].send_keys()
    
  2. 获取与定位器匹配的完整元素列表,并将列表过滤为仅显示的列表

    emails = driver.find_elements_by_name("email")
    email = next(element for element in emails if element.is_displayed())
    email.send_keys()
    
  3. 第二个可能是更好的方法......不那么脆弱。

    提示......避免此问题的一种快速方法是在浏览器中测试定位器。在Chrome中打开您的页面,然后打开开发工具栏。要测试CSS选择器,请使用$$(),例如$$("input[name='email']")。要测试XPath,请使用$x(),例如$x("//input[@name='email']")。输入这些内容时,它将返回与该定位符匹配的元素数。如果有多个,请展开集合并将每个集合悬停,直到您要查找的集合在页面上亮起。这将告诉你是否有任何一个你正在寻找的那个。然后,您可以决定是使用该定位器还是尝试其他定位器。这将帮助您在离开页面之前识别正确的定位器,而不是将其放在代码中,运行它只是为了找到它失败,然后尝试另一个。它显着减少了迭代之间的时间。

答案 1 :(得分:-1)

这不是一种非常稳定的方法,但现在效果很好。

#Find all input elements    
inp=driver.find_elements_by_tag_name('input')
#Sending keys to Email field
inp[5].send_keys('Your login name')
#Sending keys to Password field
inp[6].send_keys('Password')
#Click on login button
inp[7].click()