很多的网站都在登录页面加入了识别文字,识别图片,拖动拼图的验证码方式来防止爬虫、恶意注册 等,如果是做自动化,需要绕过验证码才能进入下一步操作,那么有4种方案可以解决我们遇到的问题。
可以和开发进行沟通,但是仅限于测试环境哦
cookie是一门客户端技术,一般是由服务器生成返回给浏览器客户端来保存的,并且cookie是以 键值对的形式保存在浏览器客户端的,每一个cookie都会有名称,值,过期时间...
如下便是一个cookie存储的位置,包含过期时间等:
1. 登录记住用户名
2. 记录用户浏览记录
1、会话cookie:保存在内存中,浏览器关闭就清除
2、持久cookie:保存在硬盘中,失效时间到之后就会清除
在登录某个网站,如果勾选【自动登录】,当下次再访问该网站时就自动处于登录状态。这个功能其实 就是将用户信息保存在浏览器的cookie中,当再次访问网站时,浏览器直接使用本地保存的cookie用户 信息进行登录。
使用这个原理,以我们在代码中也可以将用户信息添加到cookie中,再刷新浏览器即可,示例代码:
- Cookie cookie = new Cookie("XXX","XXXXXX");
- driver.manage().addCookie(cookie);
如下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生命周期存在与一次会话中(浏览器打开网页->关闭),只能作用于当前的浏览器
参考:http://testingpai.com/article/1677826568289
通过在Selenium WebDriver中执行JavaScript可以大大增强Selenium的能力,Selenium对于一些特殊 场景的元素操作无能为力,我们可以借助JavaScript来处理,比如点击、修改元素属性、滚动页面/内嵌 的滚动条等
懒加载:根据进度条的下拉,再去加载此刻下拉位置的页面数据
整体页面的滚动条移动写法:
- document.documentElement.scrollTop=200 //滑动到指定位置,0代表顶端
- document.documentElement.scrollHeight //获取页面的滚动高度
备注:以上的语句需要在console中执行才会生效哦,如下:
页面内嵌的滚动条移动需要2步,如下:
1、先去定位内嵌滚动条元素
2、再使用scrollTop进行滚动
实战演练:
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函数中都可以执行
可以看做是先通过元素定位方式找到元素,再通过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)