selenium使用headless运行时,报:Message: element not interactable

首先确定的是,如果不使用headless(selenium静默执行),那代码运行是没有问题的。

1 driver = webdriver.Chrome()
2 driver.maximize_window()
3 driver.get('xxxx.html')

问题出现在如果selenium静默执行,就会报错Message: element not interactable

1 # 设置selenium静默执行
2 chrome_options = webdriver.ChromeOptions()
3 chrome_options.headless = True
4 driver = webdriver.Chrome(options=chrome_options)
5 
6 # driver = webdriver.Chrome()
7 driver.maximize_window()
8 driver.get('xxxx.html')

报错的地方在我点击元素处:

 

这个报错的意思是: 执行点击事件的这个元素是不可操作的

 

那为什么我在浏览器模拟点击的时候就没有这个问题呢?其实很容易想到,在静默模式执行时,我们定位这个元素使用的xpath可能出了问题,定位的并不是之前我们想操作的那个元素了。

可以简单验证下:

 

 结果表明定位到的元素就是我们要点击的元素,打脸了。。

 

那为啥元素没有错,确不能点击了呢?

后面我想到了另外一种可能,因为这个元素并不是在初始页面上,而是在页面的底部,需要滚动到底部才能看到,是不是因为这个原因。

使用以下代码验证:

 

 果然,添加滚动操作后,之前元素无法操作的问题就没有了。

为了进一步验证是滚动的问题,我选取一个不需要滚动也能点击的元素进行比对:

 

 果然,可以点击,没有报错。说明问题就出在这。

 

在排查问题的时候,在网上看到一些其他的问题可能性,这里也一并列出。

比如页面等待时间不够,那就加等待时间,这里我使用显式等待:

 

 还有说需要将窗口最大化,这个我在设置driver的时候就设置了:

 

 还有就是直接click不行,需要使用ActionChains:

 

 还有官方提供的一些问题可能性可作为参考:https://stackoverflow.com/questions/47316810/unable-to-locate-elements-on-webpage-with-headless-chrome

posted @ 2022-08-12 17:12  搬砖在路上  阅读(1564)  评论(0编辑  收藏  举报