目录
问题:
每一个大学生肯定都为学习通等线上网课头疼过,所以我最近就心血来潮打算自己写一个挂课答题程序。开发到中后期测试的时候发现,有的时候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()方法操作的时候,可能因为标签触发区域被覆盖导致点击失效。