1、问题情景
使用selenium + python爬取csdn博客,其中一个步骤为点击博客详情页面的各级目录的链接,但是当鼠标点击目录链接时,页面会弹出一个登录窗口,要求登录。
如果是真实用户访问的页面,用户只需要在弹窗外面的任意灰色区域点击一下,就可以关掉这个弹窗;
但是使用selenium控制的鼠标去定位点相关元素或者点击时,则会报错,因为元素可以被定位,但是无法被点击。
但是使用selenium控制的鼠标去定位点相关元素或者点击时,则会报错,因为元素可以被定位,但是无法被点击。
注意:这种窗口是页面弹窗,不属于windows弹窗,因此,网上很多博客介绍的使用
“driver.switch_to.alert”
进入到
警示弹窗、消息弹窗等方法都是没有用的,因为那些都属于window弹窗
“driver.switch_to.alert”
进入到
警示弹窗、消息弹窗等方法都是没有用的,因为那些都属于window弹窗
出现这种情况时,如果这种弹窗没有关闭掉,弹窗后面的博客内容相关元素可以被定位,但是无法进行点击等操作,例如执行下面代码,从返回结果可以知道,元素可以被定位。
browser.find_element_by_css_selector('#articleContentId')
# 返回
<selenium.webdriver.remote.webelement.WebElement (session="0b7b7c297facdb427d72501c2bfb201f", element="de701010-0f46-4060-b6a0-20cd1006f4fe")>
接着我们在寻找到相关元素后,执行click()点击操作,结果程序报错了,从错误信息来看,元素不能被点击。
browser.find_element_by_css_selector('#articleContentId').click()
返回结果:
ElementClickInterceptedException Traceback (most recent call last)
<ipython-input-65-0ba451952723> in <module>()----> 1 browser.find_element_by_css_selector('#articleContentId').click()
因此,在出现登录弹窗的情形下,想要使用selenium执行鼠标点击等操作,需要先关闭弹窗。
2、解决办法
思路:通过分析控制台中的标签发现,弹窗的出现是由网页对应标签的style属性值来控制的(这一点可以通过手动关闭弹窗,对比该属性值前后差异进而发现),有弹窗时style属性值为“display: block;”而手动关闭后的属性值为”display: none;“,通过测试,发现将该属性值更改为”display: none;“,弹窗关闭了。所以,考虑通过使用js代码更改该属性值,并使用selenium中的execute_script()方法执行该js代码,进而达到关闭弹窗的效果。
出现弹窗后的网页标签及style属性值:
在上图中右下方的红色框框中更改属性值为”display: none;“后的效果:
然而,弹窗虽然关闭了,但是发现博客页面依然是灰色,依然无法进行鼠标操作,通过与上面相同的思路发现,页面的灰色显示,也是由网页标签的style属性控制的,通过相同得到方法,更改属性值即可(更改为:display: none;),下面展示更改属性值之后的效果:
更改后:
3、js代码及执行
js代码如下所示,其中login-mark为灰色显示标签的class属性,而login-box为弹窗标签的class属性。
$(".login-mark").css("display","none")
$(".login-box").css("display","none")
# 取消灰色显示
browser.execute_script('$(".login-mark").css("display","none")')
# 关闭登录弹窗
browser.execute_script('$(".login-box").css("display","none")')
版权声明:本文为weixin_42182448原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。