selenium解决web页面智能验证控件点击无效或验证不通过问题

这篇具有很好参考价值的文章主要介绍了selenium解决web页面智能验证控件点击无效或验证不通过问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:笔者在公司做webUI自动化的时候,在登录页面碰到了一个难题:在输入完账号密码后,需要点击一下智能验证控件。本以为是个很简单的问题,不就是定位控件后click一下就好了嘛,结果实际操作的时候,发现手动打开浏览器,可以正常点击智能控件,并验证成功,但是通过selenium启动浏览器,点击智能验证控件,控件只会闪一下验证中...后就再度恢复成未验证状态了。

原理:检测基本原理是检测当前浏览器窗口下window.navigator对象中是否包含webdriver这个属性。如果你是采用selenuim自然免不了webdriver,这个时候window.navigator对象中就会包含webdriver属性,但是在我们平常使用浏览器时,这个属性是undefined,一旦被网站上的JS判断出这个属性的不同,就露馅了。。。

解决方案一:(不建议,太麻烦)

网上搜了一下,基本看着都是用pyppeteer解决反爬的方法,安装python第三方库asyncio、pyppeteer和pyppeteer_stealth然后一顿操作猛如虎似乎可以绕过智能验证?这个方法我没试,大家可以试试看,附上相关博文:使用Python自动填写问卷星(pyppeteer反爬虫版)。

解决方案二:(建议这种,一行代码即可解决)

修改window.navigator.webdriver属性的值为undefined,python设置window.navigator.webdriver的属性有两种方式:

  1. 通过js脚本直接修改浏览器的window.navigator.webdriver的属性,此方法适用于任意浏览器,并且此方法是在浏览器启动之后执行,也就是driver.get()方法之后执行,示例代码如下:
# 设置 window.navigator.webdriver 属性为 False
driver.execute_script("Object.defineProperties(navigator,{webdriver:{get:()=>undefined}})")

注:括号里面的js脚本一定要用Object.defineProperties(navigator,{webdriver:{get:()=>undefined}})这句,
不能用Object.defineProperty(navigator, 'webdriver', {get: () => undefined}),
后面这句亲测无效

整体的设置方法,我举个例子:

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

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://baidu.com')

# 设置 window.navigator.webdriver 属性为 False
driver.execute_script("Object.defineProperties(navigator,{webdriver:{get:()=>undefined}})")

# 进行后续的自动化操作
....
driver.close()
  1. 谷歌浏览器的话可以直接与浏览器的Chrome DevTools Protocol (CDP)进行交互,通过cdp命令去设置window.navigator.webdriver的属性为undefined,此方法只适用于谷歌浏览器,并且此方法需要在浏览器启动之前执行,也就是driver.get()方法之前执行,示例代码如下:
# 这行代码的作用是将webdriver这个属性置为undefined
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})

整体的设置方法,我举个例子:文章来源地址https://www.toymoban.com/news/detail-484148.html

chrome_options = Options()
# chrome_options.add_argument('--headless')       # 关闭可视化 
chrome_options.add_argument('--disable-gpu')       # 禁用gpu加速
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
}

driver = webdriver.Chrome(executable_path='./driver/chromedriver.exe', options=chrome_options)
driver.maximize_window()
# 代码在这,放在get()之前,这行代码的作用是将webdriver这个属性置为undefined
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
driver.get('www.baidu.com')

到了这里,关于selenium解决web页面智能验证控件点击无效或验证不通过问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium登录页面点击登录页面没有跳转问题(click()失效)

    对于一般的登录界面的登录按钮用xpath定位元素再点击就可以进入页面,但是如果登录不是一个按钮而是一张图片,这时我们该怎么定位并登录成功呢? 比如下面这个登录,并不是按钮而是一个div,div里面放了图片 一开始我用了xpath定位,但是结果就是不报错也没有跳转到登录

    2024年02月08日
    浏览(48)
  • selenium click点击 跳转新页面转句柄

    1.click点击 2.跳转到新页面,selenium获取内容还停留在第一页,需要转句柄 3.截图不完整--因为 browser.switch_to.window 会缩小窗口 4.iframe在转句柄后,关闭新页面还有重新进入iframe 遇见一个a标签没有url的网站,然后用click点击进行跳转,跳转后又selenium还停留在第一个页面,查找原

    2024年02月13日
    浏览(50)
  • Chrome 阅览器标签头 鼠标点击无效解决办法

    今天打开chrome浏览器,发现在切换标签页时,无论是鼠标左键单击还是右键单击,标签页均无法进行跳转 页面整个上方基本上都是无法操作的状态。同时,收藏夹(书签)和选项按钮一点击就会把收藏的网址全部打开。 后将该版本卸载,装上最新的chrome20,以及绿色版等,电

    2024年02月08日
    浏览(60)
  • Python爬虫(二十三)_selenium案例:动态模拟页面点击

    本篇主要介绍使用selenium模拟点击下一页,更多内容请参考:Python学习指南 分享一份Python的学习资料,但由于篇幅有限,完整文档可以扫码免费领取!!! 1)Python所有方向的学习路线(新版) 总结的Python爬虫和数据分析等各个方向应该学习的技术栈。 比如说爬虫这一块,很

    2024年02月04日
    浏览(61)
  • 解决IIS 验证远程SSL证书无效

    我们给IIS上的网站设置的类型为:https,并且设置了SSL,我们在访问程序时可能会报错:System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效 。 System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效 。”这个异常,是因为远程url使用的域

    2024年02月21日
    浏览(56)
  • selenium clear()无效的解决办法

    做自动化时,在往输入框中send_keys前往往需要先清空一下这个输入框里的内容,避免输入框原本有内容或默认值,导致最终输入的结果不是预期的内容。 清空内容我们一般会用clear()方法 但用久了你就会发现clear()并非对所有的输入框都好用,即使它是一个input元素。 产生这个

    2024年02月03日
    浏览(42)
  • html web前端,点击发送验证码,按钮60秒倒计时

    html web前端,点击发送验证码,按钮60秒倒计时 eaca39b57a49d39f6c9e2f49f2559e9a.jpg

    2024年02月08日
    浏览(59)
  • C# 解决 System.InvalidOperationException:“线程间操作无效: 从不是创建控件“...”的线程访问它。”

    方法1(不推荐):禁用跨线程检查 使用 Control.CheckForIllegalCrossThreadCalls = false; 例如: 方法2:使用委托 使用 Control 基类的 Invoke 或 BeginInvoke 方法,来执行禁止跨线程的代码。 例如: 或: 使用参数进行传递: 不使用 lambda 表达式的写法: 使用 BeginInvoke 方法的情形,与使用

    2024年02月12日
    浏览(50)
  • Python爬虫技术之Selenium自动化测试及模拟点击页面爬虫最全知识

    Selenium是一套Web网站的程序自动化操作解决方案(比如点击界面按钮,在文本框中输入文字等操作) Selenium的自动化原理如下 3.1 下载selenium库的命令 3.2 下载谷歌浏览器Chrome对应的驱动 驱动库网址:http://chromedriver.storage.googleapis.com/index.html 注意:根据自己的Chrome版本进行选择

    2024年01月16日
    浏览(75)
  • uniapp - 解决 uni.chooseImage 在苹果 IOS 真机上点击没反应的问题,苹果手机点击 uni.chooseImage方法不生效,也不报任何错误(解决苹果ios系统点击无效问题)

    奇怪的是,自己新建一个 “干净” 的项目运行到苹果系统 ios 真机上测试时,调用 uni.chooseImage 方法却是正常可用的。 在 uniapp 项目开发中,苹果 ios 真机运行时,调用 uni.chooseImage 没有任何反应(并且也没走到 fail 失败的回调函数),无法打开相机和相册, 关键是也不报错

    2024年02月12日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包