from selenium importwebdriverfrom selenium.webdriver importActionChainsfrom selenium.webdriver.common.by importByfrom selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom PIL importImageimporttimeimportrandomdefif_is_s(img_1, img_2):#判断是不是跟比较的是一张图
a=0for i in range(1, img_1.size[1]):for j in range(1, 3):
rgb1=img_1.load()[i, j]
rgb2=img_2.load()[i, j]
res1= abs(rgb1[0] -rgb2[0])
res2= abs(rgb1[1] - rgb2[1])
res3= abs(rgb1[2] - rgb2[2])if res1 < 10 and res2 < 10 and res3 < 10:
a+= 1
else:
a=0if a > 50:returnTruereturnFalsedefget_distance(image1,image2):#找出需要滑动的距离
a=0
threshold=60left=57
for i inrange(left,image1.size[0]):for j in range(image1.size[1]):
rgb1=image1.load()[i,j]
rgb2=image2.load()[i,j]
res1=abs(rgb1[0]-rgb2[0])
res2=abs(rgb1[1]-rgb2[1])
res3=abs(rgb1[2]-rgb2[2])if not (res1 < threshold and res2 < threshold and res3
a+= 1
return i+20
return i+20
defget_tracks(distance):#这是滑动轨迹的,京东的滑动轨迹很恶心,这个也是有时可以有时不行
tracks=[]
current=0
mid= distance * 4 / 5t= 0.2v=0while current
a= random.uniform(2, 5)else:
a= -(random.uniform(12.5, 13.5))
v0=v
v= v0 + a *t
x= v0 * t + 1 / 2 * a * (t ** 2)
current+=xif 0.6 < current - distance < 1:
x= x - 0.53tracks.append(round(x,2))elif 1 < current - distance < 1.5:
x= x - 1.4tracks.append(round(x,2))elif 1.5 < current - distance < 3:
x= x - 1.8tracks.append(round(x,2))else:
tracks.append(round(x,2))if sum(tracks) >distance:
i= sum(tracks) -distance
tracks[-1] = round(tracks[-1] - i, 2)
i= random.uniform(1, 3)
i= round(i, 2)
zz= random.uniform(0.1, 0.3)
tracks[-1] = round(tracks[-1] + i, 2)
i= round(i - zz, 2)
tracks.append(-i)if sum(tracks)
si= distance -sum(tracks)
tracks.append(round(si,2))print(tracks, sum(tracks))returntracksif __name__=='__main__':
browser=webdriver.Firefox()
browser.get('https://passport.jd.com/new/login')
butt= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'link-login')))
butt.click()
butt= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH,'//a[@clstag="pageclick|keycount|login_pc_201804112|10"]')))
butt.click()
user= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,'loginname')))
password= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,'nloginpwd')))
user.send_keys('xxx')
time.sleep(2)
password.send_keys('xxx')
izsz= 1
while izsz == 1:#无限循环直到登录成功try:
button= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'btn-img.btn-entry')))
time.sleep(2)
button.click()
time.sleep(2)
browser.save_screenshot('1.png')#截图
page_snap_obj= Image.open('1.png')
img= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'JDJRV-bigimg')))
local=img.location
size=img.size
top= local['y']
bottom= local['y'] + size['height']
left= local['x']
right= local['x'] + size['width']
img_1= Image.open('index2.png')
img_2=page_snap_obj.crop((left, top, right, bottom))#裁剪图片尺寸
img_2.save('2.png')#保存
i=if_is_s(img_1,img_2)#判断是不是一张图,不是点击换一张while noti:
time.sleep(2)
butt= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'JDJRV-img-refresh')))
butt.click()
time.sleep(2)
browser.save_screenshot('1.png')
page_snap_obj= Image.open('1.png')
img= WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'JDJRV-bigimg')))
local=img.location
size=img.size
top= local['y']
bottom= local['y'] + size['height']
left= local['x']
right= local['x'] + size['width']
img_1= Image.open('index2.png')
img_2=page_snap_obj.crop((left, top, right, bottom))
img_2.save('2.png')
time.sleep(2)
i=if_is_s(img_1, img_2)
ji=get_distance(img_1, img_2)print(ji)
tracks=get_tracks(ji)
ijs= len(tracks)//5*3tracks1=tracks[:ijs]#对滑动轨迹继续改变
tracks2=tracks[ijs:]
z=sum(tracks1)
tracks2.insert(0,z)
tracks2.insert(0,0)
button= WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="JDJRV-slide-inner JDJRV-slide-btn"]')))
ActionChains(browser).click_and_hold(button).perform()for track intracks:
ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()
time.sleep(0.5) #0.5秒后释放鼠标
ActionChains(browser).release().perform()
url=browser.current_urlif 'https://passport.jd.com/new/login.aspx?' instr(url):
izsz= 1
else:
izsz=0except:
izsz= 1