selenium、pycharm图片滑块自动化验证测试

该代码段定义了一个LoginPage类,包含了各种元素定位方法,如手机号、验证码、登录按钮等,并实现了滑动验证的逻辑,包括图片处理、计算滑块移动距离和模拟鼠标滑动。此外,还包含了一个登录方法,支持自动登录并处理登录失败的情况。
摘要由CSDN通过智能技术生成
 class LoginPage(BasePage):
#切换验证码登录
    def vali_login_tab_element(self):
        return self.find_element(By.XPATH, '//*[@id="main"]/div/div/div/div[2]/div[1]/div[1]/div/div/div/div/div[3]')
    # 定位手机号
    def phonenum_element(self):
        return self.find_element(By.XPATH, '//*[@id="main"]/div/div/div/div[2]/div[1]/div[2]/div[2]/form/div[1]/div/div[1]/input')

    # 定位验证码
    def validatecode_element(self):
        return self.find_element(By.XPATH, '//*[@id="main"]/div/div/div/div[2]/div[1]/div[2]/div[2]/form/div[2]/div/div[1]/input')

    # 登录按钮
    def login_button_element(self):
        return self.find_element(By.CLASS_NAME, 'login-btn')

    # 安全验证按钮
    def safe_button_element(self):
        return self.find_element(By.XPATH,'//*[@id="main"]/div/div/div/div[2]/div[1]/div[2]/div[2]/form/div[3]/div/button/span')
    #发送验证码按钮
    def send_safecode_button_element(self):
        return self.find_element(By.XPATH,'//*[@id="main"]/div/div/div/div[2]/div[1]/div[2]/div[2]/form/div[2]/div/div/div[2]/button')
def slide_verify(self):
# 滑动验证
    #js = 'return document.getElementsByTagName("img")[3].src'
    #base64str = self.driver.execute_script(js)
    base64str=self.driver.find_element(By.XPATH,'//*[@id="main"]/div/div/div/div[4]/div[1]/img[2]').get_attribute('src')
    page = base64str.split(',')[1]
    imagedata = base64.b64decode(page)
    imgpath=os.path.abspath(os.path.join(os.getcwd(), "../..")) + '\\data\\img\\'
    with open(imgpath + "slider.png", "wb") as f:
        f.write(imagedata)

    base64str = self.driver.find_element(By.XPATH,
                                         '//*[@id="main"]/div/div/div/div[4]/div[1]/img[1]').get_attribute('src')

    page = base64str.split(',')[1]
    imagedata = base64.b64decode(page)

with open(os.path.abspath(os.path.join(os.getcwd(), "../..")) + '\\data\\img\\' + "bg.png", "wb") as f:
        f.write(imagedata)

    slider_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="main"]/div/div/div/div[4]/div[2]/span[2]')))

    distance = self.get_distance(imgpath+ "slider.png", imgpath+ "bg.png")
print("distance=" + str(distance))
    tracks = self.get_tracks(distance)
self.mouse_move(slider_button, tracks)



    self.wait.until(EC.visibility_of_element_located(
        (By.XPATH, '//*[@id="main"]/div/div/div/div[2]/div[1]/div[2]/div[2]/form/div[3]/div/button/span')))
    word=self.find_element(By.XPATH,'//*[@id="main"]/div/div/div/div[2]/div[1]/div[2]/div[2]/form/div[3]/div/button/span')
print(word.text)
if word.text=='验证通过':
return True
    else:
return False
def mouse_move(self, slide, tracks):
'''鼠标滑动'''

    # 鼠标点击滑块并按照不放
    ActionChains(self.driver).click_and_hold(slide).perform()
# 按照轨迹进行滑动,
    for track in tracks:
        ActionChains(self.driver).move_by_offset(track, 0).perform()
print("time sleep 1")
    time.sleep(0.5)
print("after time sleep 1")
    ActionChains(self.driver).release().perform()
print("mouse release")
    time.sleep(3)
print("after sleep")
return

def get_distance(self, slider_img_path, bg_img_path):
"""获取滑块移动距离"""

    # 背景图片处理
    bg_img = cv.imread(bg_img_path, 0)  # 读入灰度图片
    bg_img = cv.GaussianBlur(bg_img, (5, 5), 0)  # 高斯模糊去噪
    bg_img = cv.Canny(bg_img, 100, 200)  # Canny算法进行边缘检测
    # cv.imshow('canny', bg_img)
    # 滑块做同样处理
    slider_img = cv.imread(slider_img_path, 0)
    slider_img = cv.GaussianBlur(slider_img, (5, 5), 0)
    slider_img = cv.Canny(slider_img, 100, 200)
# cv.imshow('slider', slider_img)
    # 寻找最佳匹配
    res = cv.matchTemplate(bg_img, slider_img, cv.TM_CCOEFF_NORMED)

# 最小值,最大值,并得到最小值, 最大值的索引
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 例如:(-0.05772797390818596, 0.30968162417411804, (0, 0), (196, 1))
    top_left = max_loc[0]  # 横坐标
    print("min_loc=", min_loc[0])
    print("max_loc=", max_loc[0])

    len = max_loc[0]
return len

def get_tracks(self, distance):
'''滑动轨迹 '''
    tracks = []
    v = 0
    t = 0.2  # 单位时间
    current = 0  # 滑块当前位移
    while current < distance:
        a = random.randint(2, 3)
        v0 = v  # 初速度
        track = v0 * t + 0.5 * a * (t ** 2)  # 单位时间(0.2s)的滑动距离
        tracks.append(round(track))  # 加入轨迹
        current += round(track)
        v = v0 + a * t
return tracks

#登录
def login(self,phonenum=None,validatecode=None):
    account_phonenum,account_validatecode=self.get_account()

if phonenum is None:
        phonenum=account_phonenum
else:
        phonenum=phonenum
if validatecode is None:
        validatecode=account_validatecode
self.vali_login_tab_element().click()
self.phonenum_element().send_keys(phonenum)
self.validatecode_element().send_keys(validatecode)
self.send_safecode_button_element().click()
self.safe_button_element().click()
    time.sleep(3)
if self.slide_verify():
print('登陆成功')
# self.save_cookie()
        # self.driver.close()
        #self.driver.find_element(By.XPATH, value="/html/body/div[2]/div/div[2]/div/form/div[5]/div/button").click()
        #self.login_button_element().click()
        self.send_safecode_button_element().click()
self.login_button_element().click()
else:
print('第1次登陆失败')
for i in range(9):
print('正在尝试第%d次登陆' % (i + 2))
if self.slide_verify():
print('第%d次登陆成功' % (i + 2))
# self.save_cookie()
                # self.driver.close()
                #self.driver.find_element(By.XPATH,"/html/body/div[2]/div/div[2]/div/form/div[5]/div/button").click()
                self.send_safecode_button_element().click()
self.login_button_element().click()
return
            print('第%d次登陆失败' % (i + 2))
print('登陆失败10次,停止登陆')
# self.driver.close()

@staticmethod
def get_account():
#获取默认的用户名和密码
    current_path=os.path.abspath(os.path.dirname(__file__))
    json_path=current_path+'/../../config/base_data.json'
    account=ReadConfig().get_json(json_path)
return account['phonenum'],account['validatecode']
if __name__ == '__main__':
    lp=LoginPage()
    lp.login()
    time.sleep(5)
    lp.driver.quit()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值