Selenium、cv2和pyautogui实现自动化登陆淘宝

简介: Selenium、cv2和pyautogui实现自动化登陆淘宝

安装selenium cv2 pyautogui


直接win+R 输入cmd打开窗口直接输入下面语法即可安装成功,其他两个库同理


pip install selenium

通用部分:先加载对应的谷歌浏览器,用selenium把目标网页打开,然后点开登陆页面


进入页面可以定位到登陆地址发现是一个文本,可以通过find_elements()方法中的By.LINK_TEXT来定位含连接的文本元素,也可以通过CLASS_NAME来寻找元素,先进行成功登陆


注意:此处我的版本是selenium4,不同版本语法不同,本人在此处因为不同版本selenium的语法不同导致定位不到元素,一定要找到对应版本,去查官方文档才是最准确的


方法一(selenium的click和send_key方法):

同理进入到登陆页面后通过find_elements的ID定位到账号和密码区域此处先click再send_key是为了模仿人输入,并且有一个间断,不然输入太快会显示不出来一个类似滑动验证的框
+10.png

browser.find_element(By.ID, 'fm-login-id').click()
time.sleep(2)
browser.find_element(By.ID, 'fm-login-id').send_keys(id)
time.sleep(2)
browser.find_element(By.ID, 'fm-login-password').click()
time.sleep(2)
browser.find_element(By.ID, 'fm-login-password').send_keys(pwd)
time.sleep(2)

方法二(selenium执行js语句)

但如果想要点击右侧的二维码来进行二维码验证,就必须得用执行js语句才能点击,xpath和class都无法进行定位

+11.png
方法二(cv2+pyautogui):


先要进行模板自动截取,调用webdriver的屏幕截取功能,然后用cv2的办法将两张图片进行定位,然后通过计算定位到目标图片的中心点,并通过pyautogui进行点击。此方法弊端就是需要自己截取目标图像并存放在同一个包下,这就削弱了自动化的实用性,但是这是针对selenium在xpath和执行js都无法成功的条件下使用的办法,但是在这笔者试过匹配二维码图片来进行定位,鼠标定位不到图片的中心点因此卡了很久,最终还是选择用的selenium的执行js语句的办法。通常是多种办法实现。

+12.png

#保存图片
def save_pic(name):
  browser.maximize_window()
  browser.save_screenshot('./tb/' + name + '.png')
#进行模板的匹配
 def get_xy(pic_name):
  #获取模板和目标
  img_temp = cv2.imread('./tb/' + pic_name + '.png')
  img_target = cv2.imread('./tb/qrcode.png')
  #获取目标宽、高、通道数
  width, height, channel = img_target.shape
  #用matchTemplate进行模板匹配,用TM_SQDIFF_NORMED方差匹配
  result = cv2.matchTemplate(img_temp, img_target, cv2.TM_SQDIFF_NORMED)
  #成功匹配后获取匹配区域的左上目标
  upper_left = cv2.minMaxLoc(result)[2]
  #计算出右下角坐标
  lower_right = (upper_left[0] + width, upper_left[1] + height)
  # 计算坐标的平均值并将其返回
  avg = (int((upper_left[0] + lower_right[0]) / 2), int((upper_left[1] + lower_right[1]) / 2))
  return avg

全部代码

import cv2
import pyautogui
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import datetime
#对应浏览器加载
browser = webdriver.Chrome()
#防止pyautogui失控,调用为True
pyautogui.FAILSAFE = True
##方法3通过模板匹配进行点击
# def get_xy(pic_name):
#   #获取模板和目标
#   img_temp = cv2.imread('./tb/' + pic_name + '.png')
#   img_target = cv2.imread('./tb/qrcode.png')
#   #获取目标宽、高、通道数
#   width, height, channel = img_target.shape
#   #用matchTemplate进行模板匹配,用TM_SQDIFF_NORMED方差匹配
#   result = cv2.matchTemplate(img_temp, img_target, cv2.TM_SQDIFF_NORMED)
#   #成功匹配后获取匹配区域的左上目标
#   upper_left = cv2.minMaxLoc(result)[2]
#   #计算出右下角坐标
#   lower_right = (upper_left[0] + width, upper_left[1] + height)
#   # 计算坐标的平均值并将其返回
#   avg = (int((upper_left[0] + lower_right[0]) / 2), int((upper_left[1] + lower_right[1]) / 2))
#   return avg
#进行模板截图并存储,方便匹配
def save_pic(name):
  browser.maximize_window()
  browser.save_screenshot('./tb/' + name + '.png')
def get_url(url, pic_name):
  #进入目标网站,保存照片
  browser.get(url)
  time.sleep(4)
  browser.find_element(By.LINK_TEXT, '亲,请登录').click()
  save_pic(pic_name)
  time.sleep(4)
##方法1.自动输入账号密码
# def login(id, pwd):
#   browser.find_element(By.ID, 'fm-login-id').click()
#   time.sleep(2)
#   browser.find_element(By.ID, 'fm-login-id').send_keys(id)
#   time.sleep(2)
#   browser.find_element(By.ID, 'fm-login-password').click()
#   time.sleep(2)
#   browser.find_element(By.ID, 'fm-login-password').send_keys(pwd)
#   time.sleep(2)
##方法2.webdriver执行js语句用qrcode登陆
def qrcode():
  browser.execute_script('document.getElementsByClassName("iconfont icon-qrcode")[0].click()')
if __name__ == "__main__":
  url = input('请输入目标网站地址:')
  pic_name = input('请输入模板照片名字:')
  # id_input = input("请输入账号:")
  # pwd_input = input("请输入密码:")
  get_url(url, pic_name)
  # avg = get_xy(pic_name)
  # pyautogui.click(avg[0], avg[1], button='left')
  time.sleep(4)
  qrcode()

更新:对滑动验证码的反爬


有些网站可能是需要滑动滑块来动态验证的反爬机制,通常是点击下方滑键才会出现需要将滑块对应在图片的空缺处。首先我们应该获取到完整的图片,可以获取到图片元素所在的位置和尺寸来获取图片的坐标,然后我们对整个屏幕来张截图,再对这张截图来根据图片的坐标来截取图片。


+13.png

目录
相关文章
|
1天前
|
存储 JavaScript Java
《手把手教你》系列技巧篇(四十七)-java+ selenium自动化测试-判断元素是否显示(详解教程)
【5月更文挑战第11天】WebDriver 的 `isDisplayed()` 方法用于检查页面元素是否可见,如果元素存在于DOM中且可视,返回`true`,否则返回`false`。在自动化测试中,这个方法常用于验证元素是否真正显示在页面上。示例代码展示了如何使用 `isDisplayed()` 判断百度登录页面的特定错误提示文字是否出现。
10 1
|
2天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
12 2
|
3天前
|
敏捷开发 测试技术 持续交付
深入理解自动化测试框架:以Selenium为例
【5月更文挑战第16天】 随着软件行业的迅猛发展,质量保障变得愈加重要。自动化测试作为确保软件质量的重要环节,其效率和可靠性受到了广泛关注。本文旨在深入探讨自动化测试框架的构建与优化,特别是以Selenium框架为例,分析其在实际应用中的优势、常见问题以及解决方案。通过具体案例分析,揭示如何提高自动化测试的稳定性和灵活性,从而更好地服务于敏捷开发和持续集成流程。
19 5
|
3天前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
10 0
|
4天前
|
前端开发 Java 测试技术
selenium+python自动化测试--登录
selenium+python自动化测试--登录
12 2
|
4天前
|
Web App开发 缓存 前端开发
《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
【5月更文挑战第8天】这篇文档介绍了如何在IE、Chrome和Firefox浏览器中处理不信任证书的问题。作者北京-宏哥分享了如何通过编程方式跳过浏览器的证书警告,直接访问不受信任的HTTPS网站。文章分为几个部分,首先简要介绍了问题背景,然后详细讲解了在Chrome浏览器中的两种方法,包括代码设计和运行效果,并给出了其他浏览器的相关信息和参考资料。最后,作者总结了处理此类问题的一些通用技巧。
16 2
|
4天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(四十三)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-上篇(详解教程)
【5月更文挑战第7天】本文介绍了如何在Java+Selenium自动化测试中处理浏览器对不信任证书的处理方法,特别是针对IE、Chrome和Firefox浏览器。在某些情况下,访问HTTPS网站时会遇到证书不可信的警告,但可以通过编程方式跳过这些警告。
13 1
|
4天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)
【5月更文挑战第6天】本文介绍了如何使用Selenium处理含有iframe的网页。作者首先解释了iframe是什么,即HTML中的一个框架,用于在一个页面中嵌入另一个页面。接着,通过一个实战例子展示了在QQ邮箱登录页面中,由于输入框存在于iframe内,导致直接定位元素失败。作者提供了三种方法来处理这种情况:1)通过id或name属性切换到iframe;2)使用webElement对象切换;3)通过索引切换。最后,给出了相应的Java代码示例,并提醒读者根据iframe的实际情况选择合适的方法进行切换和元素定位。
12 0
|
4天前
|
Java 中间件 测试技术
深入理解自动化测试框架Selenium的设计与实现
【5月更文挑战第10天】 本文旨在深度剖析自动化测试工具Selenium的核心架构与实现机制,通过对其设计理念、组件结构以及在实际软件测试中的应用进行详细解读,使读者能够全面理解Selenium在现代Web应用测试中的重要性和有效性。文章首先介绍Selenium的发展背景及其解决的问题,然后详细探讨其架构设计,包括各种驱动和API的作用,最后结合实际案例分析Selenium如何提高测试效率和准确性。
|
4天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
【5月更文挑战第5天】本文介绍了HTML中的`iframe`标签,它用于在网页中嵌套其他网页。`iframe`常用于加载外部内容或网站的某个部分,以实现页面美观。文章还讲述了使用Selenium自动化测试时如何处理`iframe`,通过`switchTo().frame()`方法进入`iframe`,完成相应操作,然后使用`switchTo().defaultContent()`返回主窗口。此外,文章提供了一个包含`iframe`的HTML代码示例,并给出了一个简单的自动化测试代码实战,演示了如何在`iframe`中输入文本。
17 3

热门文章

最新文章