这是崔斯特的第六十篇原创文章
明明可以显示,为什么就是点不到呢 (๑• . •๑)
最近做了许多登陆项目,我会优先选择使用requests来模拟请求,但是有些参数实在是很难获取,这个时候我会使用Selenium,也还是遇到了各种坑,也算是见识到了很多的验证措施。
今天说说如何解决selenium点选不到数据的问题。
等待
这还是最常见的一种情况,推荐最多的是使用显示等待:
|
|
这段代码会等待10秒,如果10秒内找到元素则立即返回,否则会抛出TimeoutException异常。
但是我比较懒,因为time.sleep()
可以达到同样效果。
鼠标事件
官方把它叫做“行为链”。ActionChains可以完成简单的交互行为,例如鼠标移动,鼠标点击事件,键盘输入,以及内容菜单交互。
|
|
深入了解可以参考 https://blog.csdn.net/huilan_same/article/details/52305176
move_to_element_with_offset
和click_and_hold
会经常用到破解验证码中。
触摸操作 (TouchAction)
该事件仅仅针对移动端、触屏版
|
|
为什么要说到移动端,在做登陆时,移动端往往会更加简单,但是触屏版的点击和PC端时完全不同的,点击与按住时不同的。
在某个项目我换成TouchAction
后,神奇的发现,注册不再需要处理验证码了,真是太棒了。
使用js
当你使用浏览器已经找到该元素,使用click()
方法但是不起作用时,这个时候建议尝试js,例如在我的主页 https://www.zhihu.com/people/cuishite/activities,点击 “查看详细资料”
|
|
你可以先在控制台调试
js通常可以解决绝大多是问题,如果还是解决不了,那你可能和我遇到了同样的问题,比如说,我在处理某移动端网站登陆,处理如下验证码时,我会使用到move_to_element_with_offset
,该方法是“移动到距某个元素(左上角坐标)多少距离的位置”。
计算出坐标后,会调用该方法,如action.move_to_element_with_offset(element, width, height).click().perform()
,然而实际上问题并没有这么简单,多次点击失效。具体的有时间再说。
实用方法
提取selenium的cookies
介绍把selenium的cookies船体给requests使用的方法:
|
|
How do I load session and cookies from Selenium browser to requests library in Python?
元素截图方法
|
|
selenium cannot screenshot a web element
最后推荐一个神器 appium/python-client
至于验证码部分,现在主要还是靠第三方工具,并没有自己尝试机器学习等方法处理。