定位元素用.click()报错,在网上查了问题原因,有的说是页面没有加载成功就点击了,有的说元素会变化所以导致失败,加了sleep也依然报错,不是每一个脚本里的click都报错,最后用ActionChains来实现解决了click报错的问题
def test_form(self):
self.driver.get(“登录 · TesterHome”)
self.driver.find_element_by_id(“user_login”).send_keys(“123”)
self.driver.find_element_by_id(“user_password”).send_keys(“password”)
#报错
# self.driver.find_element_by_id(‘//*[@id=“user_remember_me”]’).click()
#成功
ele = self.driver.find_element_by_id(“user_remember_me”)
webdriver.ActionChains(self.driver).move_to_element(ele).click(ele).perform()
- 可能这个元素本身并不支持点击,而是它的子元素或者父元素支持点击,并且可点击区域覆盖到了该元素,所以从页面上的效果是可以点击生效,但是通过元素的click事件并不能触发其它元素的点击事件,导致报错
- 也可能这个元素的点击是一个js的事件,事件不是通过普通的点击来触发的所以导致click方法没能触发对应的js事件,这个具体还是要分析一下页面的源码,看一下具体情况。
- 你在
find_element_by_id
方法中传入的参数不是一个id 而是一个xpath表达式 - 可以把调用的方法换成
find_element_by_xpath
- 或者把传入的参数换成
user_remember_me
另外,提问贴请发到答疑区,保持论坛秩序才能让问题更快更好的获得解答
换成xpath表达式也会报错。
使用下面这个会成功
ele = self.driver.find_element_by_id(“user_remember_me”)
webdriver.ActionChains(self.driver).move_to_element(ele).click(ele).perform()
报错是报了什么错呢?截图看一下
两种方式都可以实现相同的结果的
- 看了一下页面的源码,页面中加了一个伪元素遮挡了原本的input元素,所以导致click事件去点击input元素的时候报错了
- 这种情况使用鼠标事件来操作就没有问题
- 或者也可以使用js或者直接定位到遮盖的伪元素上进行点击操作,比如使用
也可以完成点击操作