思路:
1 找到距離
2 生成滑動軌跡
3 模擬事件
兩張圖片 一個缺口圖片 一個帶缺口的完整圖
向右滑到底
1 首先獲取滑動的距離 末端 - 小圖標 中心點 適當多點無所謂
2 生成軌跡
#生成直線軌跡
def get_tracks_2( distance, seconds, ease_func):
tracks = [0]
offsets = [0]
for t in np.arange(0.0, seconds, 0.1):
ease = ease_func
offset = round(ease(t / seconds) * distance)
tracks.append(offset - offsets[-1])
offsets.append(offset)
return tracks
3 最后一步 模擬事件 滑到位置
def move_to_gap(self, track):
self._driver.web_driver_wait(2, self._driver.XPATH, 'xpath 路徑')
slider = self._driver.find_element_by_xpath('xpath 路徑')
action = ActionChains(self._driver)
action.click_and_hold(slider)
while track:
x = track.pop(0)
y = x % 2 * random.choice([4, 5, 2])
action.move_by_offset(xoffset=x, yoffset=y)
time.sleep(0.5) # 這里不加延時會導致滑塊失敗
action.release().perform()
另一種情況 籃球入框
圖片是一個小籃球 和 一個籃球框
1 計算籃球和框的坐標
self._driver.web_driver_wait(1, self._driver.XPATH, '//div[@class="rds-drag-basket"]')
basket_style = self._driver.find_element_by_xpath('xpath 路徑').get_attribute("style")
ball_style = self._driver.find_element_by_xpath('xpath 路徑').get_attribute('style')
basket_left = re.findall(r"left: (.+?)px", basket_style)[0]
basket_top = re.findall(r"top: (.+?)px", basket_style)[0]
ball_left = re.findall(r"left: (.+?)px", ball_style)[0]
ball_top = re.findall(r"top: (.+?)px", ball_style)[0]
x = int(basket_left.split('.')[0]) - int(ball_left.split('.')[0]) + 23
y = int(basket_top.split('.')[0]) - int(ball_top.split('.')[0]) + 23
self.move_to_basket(x, y)
2 生成軌跡 並移動
def move_to_basket(self, x, y):
slider = self._driver.find_element_by_xpath('xpath 路徑')
action = ActionChains(self._driver)
action.click_and_hold(slider)
track1 = self.get_tracks_2(x + random.choice([-1, -2, -3, -4, -5, 1, 2, 3, 4, 5]), random.randint(2, 4), self.ease_out_quart)
track2 = self.get_tracks_2(y + random.choice([-1, -2, -3, -4, -5, 1, 2, 3, 4, 5]), random.randint(2, 4), self.ease_out_quart)
while track1 or track2:
try:
x = track1.pop(0)
except:
x = 0
try:
y = track2.pop(0)
except:
y = 0
action.move_by_offset(xoffset=x, yoffset=y)
time.sleep(0.5) # 這里不加延時會導致滑塊失敗
action.release().perform()
最后一種 三張圖片 完整的 完整帶缺口的 缺口圖片
1 比較兩張圖片 然后灰度值 算出缺口位置
def compute_gap(self, img1, img2):
"""計算缺口偏移 這種方式成功率很高"""
# 將圖片修改為RGB模式
img1 = img1.convert("RGB")
img2 = img2.convert("RGB")
# 計算差值
diff = ImageChops.difference(img1, img2)
# 灰度圖
diff = diff.convert("L")
# print(self.otsu_threshold(diff))
table = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
# 二值化 閥值table提前計算好的
diff = diff.point(table, '1')
left = 43
for w in range(diff.size[0] - 1, left, -1):
lis = []
for h in range(diff.size[1] - 2, 0, -1):
if diff.load()[w, h] == 1:
lis.append(w)
if len(lis) > 15:
self.error = ErrorLog(img1, img2, diff, w)
return w - left
接下來就是常規操作 生成軌跡 移動記好了