Python —— 验证码的处理&执行JavaScript语句

1、验证码的处理

1、概述&绕过验证码的方案

很多的网站都在登录页面加入了识别文字,识别图片,拖动拼图的验证码方式来防止爬虫、恶意注册 等,如果是做自动化,需要绕过验证码才能进入下一步操作,那么有4种方案可以解决我们遇到的问题。

2、绕过验证码的方案

1、测试环境去除验证码

可以和开发进行沟通,但是仅限于测试环境哦

2、万能验证码 (推荐)
3、通过添加cookie绕过登录

cookie是一门客户端技术,一般是由服务器生成返回给浏览器客户端来保存的,并且cookie是以 键值对的形式保存在浏览器客户端的,每一个cookie都会有名称,值,过期时间...

如下便是一个cookie存储的位置,包含过期时间等:

1、cookie有很多使用场景,在项目中比较常见的有:

        1. 登录记住用户名

        2. 记录用户浏览记录

2、Cookie种类

       1、会话cookie:保存在内存中,浏览器关闭就清除

        2、持久cookie:保存在硬盘中,失效时间到之后就会清除

3、添加cookie解决验证码思路

在登录某个网站,如果勾选【自动登录】,当下次再访问该网站时就自动处于登录状态。这个功能其实 就是将用户信息保存在浏览器的cookie中,当再次访问网站时,浏览器直接使用本地保存的cookie用户 信息进行登录。

使用这个原理,以我们在代码中也可以将用户信息添加到cookie中,再刷新浏览器即可,示例代码:

Cookie cookie = new Cookie("XXX","XXXXXX");
driver.manage().addCookie(cookie);
4、实战

如下2个例子是使用cookie登录成功的案例

from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
# driver.add_cookie({"name":"BAIDUID_BFESS","value":"3B4FF41DB8055719BCC9FC2F05286F2C:SL=0:NR=10:FG=1"})
# 以下2个都可以登录,都已做修改,需要更换value值为自己的哦
driver.add_cookie({"name":"BDUSS","value":"lqNHpnQXp5T0dNOENIZjFZUmxYMzlDOVhqRHh2QXVKNk1aRDM1VjFrR0xFeDFsRVFBQUFBJCQAAAAAAAAAAAEAAADI2G41wO7o97e8Y2NjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIuG9WSLh——————————————————————"})
# driver.add_cookie({"name":"BDUSS_BFESS","value":"lqNHpnQXp5T0dNOENIZjFZUmxYMzlDOVhqRHh2QXVKNk1aRDM1VjFrR0xFeDFsRVFBQUFBJCQAAAAAAAAAAAEAAADI2G41wO7o97e8Y2NjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-------WSLhvVkd2"})
sleep(3)
driver.refresh()
sleep(3)
driver.close()
from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.ketou--pai.com/#/XXXXe")

# 以下可以
driver.add_cookie({"name":"token","value":"239d9d96328871ab2a5190d9e3f38fae042a3fa6aec691a4319b9------------ed30"})
sleep(5)
driver.refresh()
sleep(3)
driver.close()
扩展知识:

1、cookie失效的条件

        1、手动退出登录,那么当前的cookie就会失效

        2、cookie已经超过有效期

2、为什么会话cookie不能作为登录的鉴权代替用密码和密码完成登录操作

        因为会话cookie生命周期存在与一次会话中(浏览器打开网页->关闭),只能作用于当前的浏览器

4、通过OCR识别技术-识别图片的里面关键信息(文字/数字)

参考:http://testingpai.com/article/1677826568289

3、一些扩展知识

2、JavaScript操作(在Python中执行JavaScript语句)

通过在Selenium WebDriver中执行JavaScript可以大大增强Selenium的能力,Selenium对于一些特殊 场景的元素操作无能为力,我们可以借助JavaScript来处理,比如点击、修改元素属性、滚动页面/内嵌 的滚动条等

1、使用JavaScript的场景&使用模板

1、浏览器页面的滚动条(或者懒加载)

懒加载:根据进度条的下拉,再去加载此刻下拉位置的页面数据

整体页面的滚动条移动写法:

document.documentElement.scrollTop=200 //滑动到指定位置,0代表顶端
document.documentElement.scrollHeight //获取页面的滚动高度

备注:以上的语句需要在console中执行才会生效哦,如下:

2、页面内嵌的滚动条

页面内嵌的滚动条移动需要2步,如下:

        1、先去定位内嵌滚动条元素

        2、再使用scrollTop进行滚动

实战演练:

2、在Python代码中调用JavaScript

1、方式一:不传参

1、可以看做元素的定位和操作都是在JavaScript语句中完成的,模板语句如下:

driver.execute_script("...");

2、实战 

from time import sleep
from  selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.dangdang.com/")
driver.maximize_window()
sleep(2)
# 页面整体的进度条向下滑动500个像素
driver.execute_script('document.documentElement.scrollTop=500')
# 随着下拉进度条的移动,寻找元素,driver.page_source是获取当前页面所有的元素代码
distant = 200
while True:
    if '为您推荐' in driver.page_source:
        print("元素找到了~")
        break
    else:
        driver.execute_script(f'document.documentElement.scrollTop={distant}')
        sleep(1)
        distant += 200

#执行JavaScript代码滚动
driver.execute_script('document.getElementsByClassName("el-scrollbar__wrap")[2].scrollTop=200')

总结:只要在浏览器的console中可以执行且有效的代码,放在driver.execute函数中都可以执行 

2、方式二:传参

可以看做是先通过元素定位方式找到元素,再通过JavaScript执行一些操作,模板语句如下:

element = driver.find_element(By.ID,"XX")
driver.execute_script("arguments[0]...",element)

实战:

# JavaScript传参,滚动条元素
element = driver.find_element('//div[@x-placement="bottom-start"]//div[contains(@class,"el-select-dropdown__wrap")]')
# 通过Python代码找到的元素传参给JavaScript,arguments[0]代表的是外部传进来的参数
driver.execute_script('arguments[0].scrollTop=200',element)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值