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()
selenium、pycharm图片滑块自动化验证测试
最新推荐文章于 2024-07-26 15:12:30 发布
该代码段定义了一个LoginPage类,包含了各种元素定位方法,如手机号、验证码、登录按钮等,并实现了滑动验证的逻辑,包括图片处理、计算滑块移动距离和模拟鼠标滑动。此外,还包含了一个登录方法,支持自动登录并处理登录失败的情况。
摘要由CSDN通过智能技术生成