python3.8.1+selenium解决登录滑块验证的问题

python3.8.1+selenium解决登录滑块验证的问题

python3.8.1+selenium解决登录滑块验证的问题_第1张图片
这里的滑块是qq邮箱的截图,如图所示,可以作为同类滑块验证的参考。

"""
auther = "zwb",这里使用的python版本是3.8.1,selenium版本是3.141.0,webdriver是谷歌,版本是81.0.4044.138(正式版本) (64 位)
webdriver各版本对应的浏览器下载地址:https://npm.taobao.org/mirrors/chromedriver,这个脚本是以qq邮箱登录为例
"""
import unittest
from selenium import webdriver
from time import *
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait


def get_track(distance):
    track = []
    current = 0
    mid = distance * 3 / 4
    t = 0.2
    v = 0
    while current < distance:  # 定义循环条件,如果为真则继续,为假则不继续
        if current < mid:  # 正常的if...else结构
            a = 2 # 定义加速度
        else:
            a = -3
        v0 = v
        v = v0 + a * t  # 定义移动速度,哈哈哈,v = v0+at
        move = v0 * t + 1 / 2 * a * t * t  # 定义每次滑块移动的距离,也是如此.s=v0t+1/2at**2,hahha,写这个的是高手,活学活用
        current += move  # 每次遍历得到的move用current保存起来
        track.append(round(move))  # 将得到的move取整添加的列表中,每次都添加到列表尾部,可以用extend多次添加和insert添加到自己想要的位置
    return track  # 返回每次移动的轨迹列表

class testUiProject(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()  # 定义驱动器
        self.url = "https://mail.qq.com/" # 定义需要访问的地址url
        self.driver.implicitly_wait(30)  # 设置隐式等待时间
        self.driver.set_script_timeout(45)  # 设置异步脚本加载超时时间
        self.driver.set_page_load_timeout(45)  # 设置页面加载超时时间
        self.driver.maximize_window()  # 设置页面窗口最大化

    def test_First_Case(self):
        global iframe, start_position  # 函数内部定义全局变量
        driver = self.driver  # 定义浏览器驱动
        driver.get(self.url)  # 得到url打开网站
        username = "qq邮箱账号"  # 定义用户账户
        password ="qq密码"  # 定义用户密码
        driver.switch_to.frame("login_frame")  # 打开网页后,查看是否有iframe标签,如果有则需要跳转到该标签后进行定位,这里使用id定位
        self.driver.find_element_by_xpath("//*[@id='u']").send_keys(username)  # 传入用户账号
        self.driver.find_element_by_xpath("//*[@id='p']").send_keys(password)  # 传入用户密码
        self.driver.find_element_by_id("login_button").click()  # 点击登录按钮
        sleep(2)  # 等待资源加载
        # driver.switch_to.default_content()  切换到顶层标签,如果之前的iframe标签和现在iframe标签不一致则需要切换,否则不需要
        # driver.switch_to.frame("tcaptcha_iframe")
        WebDriverWait(driver, 5, 0.5).until(
            EC.presence_of_element_located((By.ID, "tcaptcha_drag_thumb"))  # 等待图片加载出来
        )
        try:
            start_position = driver.find_element_by_id("tcaptcha_drag_thumb")  # 得到滑块的初始位置,并进行异常处理
        except Exception as e:
            print("get button failed: ", e)
        sleep(2)  # 等待资源加载
        distance = 300    # 这里根据qq邮箱的初始窗口大小得到的宽度取值
        while 1:
            action = ActionChains(driver)  # 定义ActionChains
            action.click_and_hold(start_position).perform()  # 点击初始滑块位置并保持不释放
            action.reset_actions()  # 清除之前的action
            track = get_track(distance)  # 调用移动轨迹函数并传入距离distance,distance根据定位的滑块窗口大小自己设定
            for i in track:   # 利用循环模拟滑块移动轨迹,xoffset是横向移动,yoffset是纵向移动,这里不纵向移动,所以yoffset=0
                action.move_by_offset(xoffset=i, yoffset=0).perform()
                action.reset_actions()  # 清除之前的action
            sleep(0.5)
            # action.release().perform()  释放鼠标保持点击状态,这句话可以根据需要保留,目前这里不需要保留,保留会使得循环提前终止
            sleep(5)

    def tearDown(self):
        self.driver.quit()


if __name__ == "__main__":
    unittest.main()

你可能感兴趣的:(测试)