Selenium 高级点儿的技能都有啥?

发表于:2021-8-18 09:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:梦想橡皮擦    来源:掘金

  Selenium 滑块操作
  滑块验证是验证码的一种进化,在 2020 年已经不经常见到了,大多数都已经被滑动拼图验证码给替代了,但是也有少数的网站,依旧采用滑动验证,例如天猫注册页面,携程注册页面。
  本篇博客以天猫注册为例,为你说明如何解决滑块验证码的问题。
  步骤如下:
  1.打开天猫注册页面;
  2.同意注册协议;
  3.拖动滑块到最右侧。
  打开注册页面,点击同意
  打开页面,查看一下同意协议按钮,重点查看如何获取到按钮元素。
  在执行代码之后,发现出现问题了,打开天猫注册页面 https://register.tmall.com/的源码,里面竟然没有要获取的标签,而是嵌套了一个子网页,厉害~
  检查之后,发现真正的注册地址如下:
  https://reg.taobao.com/member/reg/fill_mobile.htm
  有了真实的地址就可以进行代码的编写了。
  from selenium import webdriver
  import time
  driver = webdriver.Firefox()
  # 浏览器最大化
  driver.maximize_window()
  # 打开注册页面
  driver.get('https://reg.taobao.com/member/reg/fill_mobile.htm')
  # 点击同意协议按钮 J_AgreementBtn
  driver.find_element_by_id("J_AgreementBtn").click()
  time.sleep(5)
  driver.quit()
  寻找滑块区域与滑块
  点击同意协议之后就是寻找滑块的过程了,通过开发者工具进行定位。
  最终多次尝试之后,得到的代码如下:
  # 发现滑块区域部分代码
  scale = driver.find_element_by_id("nc_1_n1t")
  print(scale.size)
  # 发现区域滑块
  sc = driver.find_element_by_by_id("nc_1_n1z")
  print(sc.size)
  实现拖动环节
  拖动咱采用 Selenium 给提供的 drag_and_drop_to_offset 方法。具体代码如下,以下代码过程中存在微调,也就是说需要反复调整参数,最终实现理想的效果。
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  import time
  driver = webdriver.Firefox()
  # 浏览器最大化
  driver.maximize_window()
  # 打开注册页面
  driver.get('https://reg.taobao.com/member/reg/fill_mobile.htm')
  # 点击同意协议按钮 J_AgreementBtn
  driver.find_element_by_id("J_AgreementBtn").click()
  # 发现滑块区域部分代码
  scale = driver.find_element_by_id("nc_1_n1t")
  print(scale.size)
  # 发现区域滑块
  source = driver.find_element_by_id("nc_1_n1z")
  print(source.size)
  # 拖拽滑块,从左侧拖拽到右侧
  ActionChains(driver).drag_and_drop_by_offset(source,scale.size["width"],source.size["height"]).perform()
  time.sleep(5)
  driver.quit()
  具体实现代码的效果出现之后,还是非常有意思的,希望你可以运行一下。
  Selenium 实现截图操作
  通过 Selenium 实现截图在自动化测试中有两个目的,一个是截取错误信息,方便测试,另一个是捕获验证码,方便后续处理。
  网页截图操作
  实现网页截图非常简单,直接用 Selenium 自带的 save_screenshot 方法即可,有了这个方法之后,你碰到的网页在也不用安装插件进行截图了,可以自己写一个小程序。
  driver.save_screenshot("dangdang.png")
  直接使用获取的是浏览器访问网页首屏的截图,如何实现截取完整网页呢?只需要通过 JS 即可解决。
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  import time
  driver = webdriver.Firefox()
  # 打开注册页面
  driver.get('http://www.dangdang.com/')
  # 通过 JS 代码获取网页的宽度和高度
  width = driver.execute_script("return document.documentElement.scrollWidth")
  height = driver.execute_script("return document.documentElement.scrollHeight")
  # 设置浏览器的宽高
  driver.set_window_size(width, height)
  time.sleep(5)
  driver.save_screenshot("dangdang.png")
  driver.quit()
  指定元素截图
  元素截图,其实是配合另一个库完成的,该库为 pillow,专门用于处理图像的库。
  通过 pip install pillow 安装新库。
  接下来以途牛旅游网注册页面为例,给你演示一下如何截取指定元素。注意下面代码获取网页元素坐标的方法,后来发现方法不是很好用,进行了 N 多的尝试,试出来的数字。不同的网站解决办法不同,可以自行试一下。
  from selenium import webdriver
  import time
  from PIL import Image
  driver = webdriver.Firefox()
  driver.maximize_window()
  # 打开注册页面
  driver.get('https://passport.tuniu.com/register')
  time.sleep(3)
  # 截取全屏
  driver.save_screenshot("./tuniu.png")
  # 找到验证码区域 identify_img
  code = driver.find_element_by_id("identify_img")
  # 获取元素在网页中的坐标,这个地方通过代码不太准确,尝试了多次取值
  left = 1040 # code.location['x']
  up = 590 #code.location['y']
  print(code.size["width"],code.size["height"])
  right = left + code.size["width"]
  below = up + code.size["height"]
  im = Image.open('./tuniu.png')
  im = im.crop((left, up, right, below))
  im.save("./code.png")
  driver.quit()
  拿到验证码图片之后,可以通过一些打码平台实现自动登录某些网站。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • 王晓玉
    2021-9-16 16:23:44

    为什么我自动化跑的时候,打开的地址就变成了https://reg.taobao.com/member/reg/fast/union_reg?_regfrom=TB,,,就没有协议的按钮

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号