** 关于这个错误,我花费了一天时间,在此记录下设想过程、解决思路和最终方案:**
-
设想一:当然Google搜索啦,各种情况都有,其中最逗比的评论是:此报错很玄学,完全看人品。貌似有点道理,在操作的浏览器的模块中不报错,而把这模块导入其他模块执行时报错。当时我有种将两个模块写在一起的冲动,最终为防止逻辑混乱,代码难看才没合二为一。
搜索到的方案:
- 将ChromeDriver.exe放置在.Py文件中的
- 设置睡眠时长的
- 修改环境的:Chrome的版本,ChromeDriver的版本,selenium的版本,python的版本
对我的报错没用,大家可以试试
-
设想二:调用网页中的js函数
先展示原文件:
<li data-value="f_three" role="presentation" class="bettype-button-list">#这里class变化 <a href="#f_three" aria-controls="f_three" role="tab" data-toggle="tab" ariaexpanded="false"onclick="SetDefaultButton('f_three')">前</a> </li> html1 --------以上文件 -------------------- <div class="list bet-type-button-group"> <span class="span_text">组</span> <div class="text"> <ul class=""> <li class="bet-type-button active" id="NumberMatchForL3StarC3Double"><span>xxx</span></li> <li class="bet-type-button" id="NumberMatchForL3StarC3Single"><span>yyy</span></li> <li class="bet-type-button" id="NumberMatchForL3StarC6Double"><span>zzz</span></li> <li class="bet-type-button" id="NumberMatchForL3StarC6Single"><span>aaa</span> <span>AAAA</span>#这里 </li> <li class="bet-type-button" id="NumberMatchForL3StarMix"><span>ccc</span></li> <li class="bet-type-button" id="NumberMatchForL3StarSum"><span>vvv</span></li> <li class="bet-type-button" id="NumberMatchionForL3StarD1"><span>bbb</span></li> </ul> </div> </div> ----- html2
分析:点击HTML1中a标签,执行onclick()函数,使得class属性加上active(bootstrap中改变其css,使得HTML2文件显示出来),ariaexpanded变为True,
我需要点击html2中的span标签,使得其父级标签Li的class属性加上active
python代码实现:
#此处元素隐藏,点击后可见,但不可操作 sleep(2) js = "return SetDefaultButton('f_three')" self.dr.execute_script(js)
还是同样报错,看来调用网页js不好使,那我自己写js
3. 设想三:不使用网页js,使用jQuery写的js (网页加载jQuery)
代码实现:
sleep(2) js = "$('#NumberMatchForM3StarC6Double > span').click()" self.dr.execute_script(js)
ok!完美解决!
总结:
- element not interactable 谷歌翻译------------------> 元素不可交互,原因:元素被隐藏,即使HTML2中li标签都可见,但用selenium的click函数却无法点击。看来“可见”和“可操作”对人而言是一样,对selenium而言是两种状态。
- 此时,该考虑用js代码来解决。事实证明,使用网页中js代码,没用。我用jQuery写的js代码,最终实现功能。用原生js还是jQuery中的js应该都行,当然分网页有没有用引入jQuery
网友评论