selenium截取图片到的位置和实际不同问题

from PIL import Image,ImageGrab
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from collections import Counter
import time

二值化

def sharp(image):
w, h = image.size
tem = 0
for i in range(w):
for j in range(h):
tem += image.getpixel((i, j))

pixel_ave = tem / w / h
for i in range(w):
    for j in range(h):
        p = image.getpixel((i, j))
        if p > pixel_ave:
            image.putpixel((i, j), 255)
        else:
            image.putpixel((i, j), 0)

return image

#获得图片的像素点集
def getPointList(i, j, Range):
for x in range(i - Range, i + Range + 1):
for y in range(j - Range, j + Range + 1):
if x == i and y == j: continue
yield (x, y)

降噪

def reduceNoise(image):
w, h = image.size
Range = 3
f = 0.05
for i in range(w):
for j in range(h):
if i < w * f or i > w * (1 - f) or j < h * f or j > h * (1 - f):
image.putpixel((i, j), 255)
p = image.getpixel((i, j))
if p < 100:
count = 0

            for x, y in getPointList(i, j, Range):
                if image.getpixel((x, y)) < 100:
                    count += 1
            if count < 0.5 * (Range * 2 + 1) ** 2 - 1:
                image.putpixel((i, j), 255)
return image

#判断是不是跟比较的是一张图
def if_is_s(img_1, img_2):
a = 0
for i in range(1,img1.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 = 0
if a > 50:
return True
return False
#计算滑动块和缺块之间的距离
def calDistance(image):
w,h=image.size
ls=[]
for i in range(40,w-40):
for j in range(10,h):
#说明黑点
if image.getpixel((i,j))<100:
#计算这个点右侧40个点中,有多少个黑点
count=0
for k in range(i,i+40):
if image.getpixel((k,j))<100:
count+=1
else:
break
if count>36:
ls.append(i)
return Counter(ls).most_common(1)[0][0]
#计算轨迹
def get_ls(distance):
ls=[1,2]
#移动轨迹为2的倍数的等比数列,为防止移动轨迹太大,再超过32时,设置为32
while 1:
delta_s=ls[-1]2
if delta_s>32:
delta_s=32
ls.append(delta_s)
if sum(ls)>distance
1.1:
break
#移动轨迹超出预定值后,倒退
a=distance-sum(ls)
for i in range(0,4):
ls.append(int(a/4))
b=distance-sum(ls)
ls.append(b)
return ls

if name==‘main’:
Chrome=webdriver.Chrome()
Chrome.get(“https://passport.jd.com”)
Chrome.maximize_window()
user_login=WebDriverWait(Chrome,10).until(EC.presence_of_element_located((By.CLASS_NAME,“user_login”)))
user_login.click()
login=WebDriverWait(Chrome,10).until(EC.presence_of_element_located((By.LINK_TEXT,“账户登录”)))
login.click()
login_name=WebDriverWait(Chrome,10).until(EC.presence_of_element_located((By.ID,“loginname”)))
login_name.send_keys(‘123123123’)
Chrome.find_element_by_id(“nloginpwd”).send_keys(‘123123123’)
button=Chrome.find_element_by_id(“loginsubmit”)
button.click() #之后会跳出验证码
time.sleep(2)
while 1:
Chrome.save_screenshot(‘1.png’)#截图
png=Image.open(‘1.png’)
img=WebDriverWait(Chrome,10).until(EC.presence_of_element_located((By.CLASS_NAME,‘JDJRV-bigimg’)))
local=img.location
print(local)
size=img.size
print(size)
#获得滑动验证码在截图上的位置
top=local[‘y’]
bottom=local[‘y’]+size[‘height’]
left=local[‘x’]
right=local[‘x’]+size[‘width’]
#将自己下载的图片和截图上的滑动验证码进行对比
img1=Image.open(‘jingdong.png’)
img2=png.crop((left,top,right,bottom)) #裁剪图片尺寸
img2.save(‘2.png’)
i=if_is_s(img1,img2) #判断是否是同一张图,如果不是则换图
while not i:
time.sleep(2)
tran=WebDriverWait(Chrome,10).until(EC.presence_of_element_located((By.CLASS_NAME,“JDJRV-img-refresh”)))
tran.click()
time.sleep(2)
Chrome.save_screenshot(‘1.png’)
png = Image.open(‘1.png’)
img = WebDriverWait(Chrome, 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’]
img1 = Image.open(‘jingdong.png’)
img2 = png.crop((left, top, right, bottom))
img2.save(‘2.png’)
i = if_is_s(img1, img2)
distance=calDistance(img1)
print(distance)
ls=get_ls(distance)
print(ls)
# 鼠标左键点击按钮并且不放
ActionChains(Chrome).click_and_hold(button).perform()
for track in ls:
ActionChains(Chrome).move_by_offset(xoffset=track,yoffset=0)
time.sleep(0.5)#0.5秒后松开鼠标
ActionChains(Chrome).release().perform()
time.sleep(0.1)
Chrome.save_screenshot(‘3.png’)

这是通过selenium截取的图img1:这是通过P[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imbxml9KPog.csdnimg.cn/20200506134758272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbGVuY2Vfb3g=,size_16,color_FFFFFF,t_70)https://img-blogI.csdnimg.cn/20200506134758272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbGVuY2Vfb3g=,size_16,color_FFFFFF,t_70)]
这是通过获取到图片坐标后截取的img2:
在这里插入图片描述
我们得到的滑动验证码的位置是:x=815,y=230
在这里插入图片描述

然后我们根据在网页上实际测量得到滑动验证码的位置大约在:x=1205,y=280的位置,所以我们未得到相应的滑动验证码图片与我们保存的滑动验证码图片比较。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值