解决Python中selenium自动化开发中click()点击无效的问题

目录

问题

解决方案

一、元素含有href属性,属性为JavaScript

二、元素含有href属性,属性为超链接

三、目标元素是输入框形式的元素

四、标签的触发区域问题

总结


问题:

每一个大学生肯定都为学习通等线上网课头疼过,所以我最近就心血来潮打算自己写一个挂课答题程序。开发到中后期测试的时候发现,有的时候click()方法点击元素有效有的时候无效。出现问题的代码片段如下:

wait = WebDriverWait(browser, 10)
wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//div[@id="content1"]//div[@class="cells"][{}]/div[{}]/h4/span'.format(item + 1, node_ordinal + 1))))
node = browser.find_element(By.XPATH, '//div[@id="content1"]//div[@class="cells"][{}]/div[{}]/h4/span'.format(item + 1, node_ordinal + 1))
node.click()

解决方案:

当时就麻了呀,上网查是有以下几个原因:

一、元素含有href属性,属性为JavaScript:

对于这种情况就要模拟js点击操作了,代码可以参考如下:

javascript = 'document.getElementsByClassName("btn btn-login")[0].click()'
driver.execute_script(javascript)

二、元素含有href属性,属性为超链接:

对于这种情况就需要获取超链接内容也就是href的值后,另开一个新的选项卡转到href链接,参考代码如下:

url = element.get_attribute('href')    //获取目标元素href的值
browser.execute_script('Window.open()')    //新开一个选项卡
browser.switch_to.window(browser.window_handles[-1])    //将操作焦点转到新创的选项卡
browser.get(url)    //进入链接

三、目标元素是输入框形式的元素:

此时可以通过模仿键盘输入回车键达到提交表单跳转页面,参考代码如下:

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

input = browser.find_element(By.ID, 'kw')
input.send_keys('Python')
input.send_keys(Keys.ENTER)

四、标签的触发区域问题:

虽然前三个能解决大部分的click()点击无效的问题,但是我的问题还是没能解决,于是我去selenium官网看了一下click()相关文档,还真让我发现了问题所在,先上官网原话截图:

图中划红线的部分就是问题所在。整句话翻译过来就是:如果目标元素尚未交互,那么click()方法会模拟鼠标点击标签图形的中心区域,问题就出在这个中心区域。对于中心区域的定义就像官方举的例子一样:

每个标签都有固定的光标出发区域,但是如果区域中心点被覆盖那么点击就会失效。

我在元素审查的时候也发现,这玩意能不能触发有时候会被标题标签h给覆盖掉,于是我就找找看有没有别的元素也能用代替被点击并且百分百触发,还真让我找到了span标签,不光可以触发页面跳转,而且它的触发中心没有被覆盖,把代码修改一下之后调试没问题了。

总结:

如果有码友使用selenium做可视化自动爬虫的时候要注意了,对于标签执行click()方法操作的时候,可能因为标签触发区域被覆盖导致点击失效。

点击这里查看selenium官方click()方法相关文档

点击这里查看selenium官方标签区域相关文档

物联沃分享整理
物联沃-IOTWORD物联网 » 解决Python中selenium自动化开发中click()点击无效的问题

发表评论