selenium点击(click)页面元素没有反应(报element not interactable)的一个案例

3 篇文章 0 订阅
3 篇文章 0 订阅

今天在QQ群上发现一哥们提了个问题,说是有个页面的按钮一直没法点击,用了js也没效果。
还好网站不是他们内网系统,好奇心的驱使下,点进去研究了下。
网址如下:https://www.ningmengyun.com/
需求:
打开网页后,点击登录按钮,弹出登录窗口,点击【密码登录】按钮,切换到账号密码登录界面
在这里插入图片描述
切换后:
在这里插入图片描述
看起来是不是很简单,于是我直接按F12,看下是不是有iframe之类的,结果并没有,而是很容易就写出了xpath:
//div[@class=“modal-bottom”]/a[text()=‘密码登录’]
在这里插入图片描述
直接上代码:

from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.ningmengyun.com/')
sleep(2)
driver.find_element_by_id('regionNav').click()
sleep(2)
driver.find_element_by_xpath("//div[@class='modal-bottom']//a[text()='密码登录']").click()

运行后发现登录窗口没有任何反应,而且运行报错了……
在这里插入图片描述
难道是xpath不对?
我在代码打开的窗口里再次用F12定位下,发现class居然变了……
在这里插入图片描述
好吧,那我再改下xpath好了:

from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.ningmengyun.com/')
sleep(2)
driver.find_element_by_id('regionNav').click()
sleep(2)
driver.find_element_by_xpath('//a[@class="go-login" and text()="密码登录"]').click()

结果这次是没报错了,但是窗口还是没切换啊?
不会是xpath还能变第二次吧?
按F12一看,好家伙,class又变回去了……
在这里插入图片描述
然后花了一个多小时就发现每次定位都是这2个xpath之间变来变去,就是用js也是不行。
最后发现,要执行2次click(),而且这两次click()的元素xpath就是上面的两个,才能正常切换。代码如下:

from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.ningmengyun.com/')
sleep(2)
driver.find_element_by_id('regionNav').click()
sleep(2)
driver.find_element_by_xpath('//a[@class="go-login" and text()="密码登录"]').click()
sleep(2)
driver.find_element_by_xpath("//div[@class='modal-bottom']//a[text()='密码登录']").click()
# 如果用js的话,也需要2次js
# driver.execute_script("document.getElementsByClassName('go-login')[2].click()")
# driver.execute_script("document.getElementsByClassName('modal-bottom')[0].children[0].click()")

最后虽然问题解决了,但是还是不大明白其中有啥问题。
自己打开网址操作,弹出的【密码登录】按钮的xpath和用selenium打开的页面按钮的xpath居然不一样,要先click()一次之后才会一样……难道是和onclick属性有关?
总之先把解决的办法记录下来,下次遇到类似的问题参考下了。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个异常通常表示Selenium无法与页面元素交互,通常是由于元素未完全加载或被其他元素覆盖所致。以下是一些可能解决此问题的方法: 1. 确保元素已完全加载:您可以使用WebDriverWait等待特定元素的出现或可见性。例如: ``` from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'my-button'))) ``` 2. 确保元素没有被其他元素覆盖:您可以使用JavaScript执行脚本来滚动到元素位置并单击它。例如: ``` element = driver.find_element_by_id('my-button') driver.execute_script("arguments[0].scrollIntoView();", element) driver.execute_script("arguments[0].click();", element) ``` 3. 确保元素可见:如果元素被其他元素遮挡,您可以尝试通过模拟键盘操作来单击元素。例如: ``` element = driver.find_element_by_id('my-button') element.send_keys(Keys.RETURN) ``` 希望这些解决方法对您有所帮助。 ### 回答2: "selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable" 是Selenium中的一个异常,表示无法与元素行交互。 常见的导致此异常的原因有以下几点: 1. 元素被其他元素覆盖:当需要与一个元素行交互时,可能会出现该元素被其他元素部分或完全覆盖的情况。这可能是由于页面布局或元素渲染导致的,可以通过调整元素的定位或等待页面加载完全后再行操作来解决。 2. 元素被隐藏:有时候页面中的元素可能被设置为隐藏状态,可能是通过CSS属性(例如display: none)或JavaScript动态隐藏的。在这种情况下,需要先将元素设置为可见状态,才能行交互。 3. 元素未完全加载:有时候元素可能需要一段时间才能完全加载出来,例如通过AJAX或JavaScript生成的动态元素。在这种情况下,需要等待元素加载完成后才能行交互,可以使用等待方法(例如显式等待或隐式等待)来解决。 解决该异常的方法包括: 1. 确保元素正确定位并可以被正确操作。 2. 检查元素是否被其他元素遮挡,如果是则需要调整元素定位或等待其他元素消失。 3. 检查元素是否隐藏或者未完全加载,如果是则需要行相应的操作或等待。 总之,当出现"selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable"异常时,需要仔细检查代码中的元素定位和操作,以及页面的加载状态,逐一排查可能的原因,然后行相应的调整或等待,以确保能够成功与元素行交互。 ### 回答3: selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable这个错误是由于使用Selenium自动化测试框架时,尝试与一个不可操作的元素行交互引发的异常。 造成这个错误的原因可能有以下几种情况: 1. 元素被遮挡:某些元素可能被其他元素覆盖或遮挡住了,导致无法与其行交互。解决方法可以通过调整元素的显示位置或者使用鼠标操作来行交互。 2. 元素状态不可交互:有些元素可能处于不可操作的状态,例如按钮的属性被禁用或者元素处于隐藏状态。解决方法是确保元素处于可操作的状态,例如检查元素的属性或者等待元素加载完全。 3. 元素选择器有误:有时候选择器选择的元素并非自己所期望的元素,这种情况下尝试与该元素行交互就会失败。解决方法是检查元素选择器是否正确,并且能够准确地选择到目标元素。 总之,要解决这个错误,需要仔细检查和分析代码,找出导致该异常的具体原因,然后采取相应的措施行修复。可以通过调整元素的显示位置、确认元素的状态、调整元素选择器等方式来解决这个问题。另外,也可以在代码中加入适当的等待操作,确保页面元素完全加载和可操作之后再行交互,以避免出现该异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值