Pythonはスライディング検証を実装しています

自動テストを行うときは、QQメールボックスに自動的にログインする必要があります。インターネットで見つけたものはセレンに基づいています。リンクを参照してください。ただし、ローカルで実行するとコードは満足のいく結果を達成しませんスライドは失敗します。
さらに、スライドによってロック解除される各Webページが異なり、エンコードと形式が異なり、再利用率が低すぎます。例えば:

button = browser.find_element_by_id('tcaptcha_drag_button')
x, y = button.location.get('x'), button.location.get('y')
print("location:",x,y)

このコードは、スライド式ロック解除ボタンの座標を取得するためのものですが、デスクトップピクセル(1920,1080)に従って取得する必要のある座標ではなく、(33,193)を返します。
ここに画像の説明を挿入
ウェブページのソースコードを見ると、この確認ボックス:幅:300px、高さ:230pxであることがわかります。したがって、座標はこのiframeフレームに従って取得されるため、ボタンをドラッグして後ろにスライドすると問題が発生します。 (たとえば、少しドラッグすると、エラーが報告されます:(300,230)境界エラーを超えています)、常に右にドラッグできないため、長時間機能しません(私の前部が原因の1つです)。 -エンドファンデーションが強くない)
とにかく、話さない他の問題がいくつかあります、それは精神の爆発です:私はセレンを使いたくないスライドに従事しています!
ボタンの画像を見つける方法を変更してから、スライド検証を実装しました。特定の画像の配置については、ac.find_templateを参照して画像を識別し、位置を特定してください。

コードをアップロードするだけです:

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import paramiko
import pyautogui
import os
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Auto_Test.base_action import match

def login_in():
    browser = webdriver.Firefox()
    browser.maximize_window()
    browser.get("https://mail.qq.com/")
    browser.switch_to.frame("login_frame")
    browser.find_element_by_class_name("inputstyle").clear()
    browser.find_element_by_class_name("inputstyle").send_keys("3540830376")
    browser.find_element_by_class_name("inputstyle.password").clear()
    browser.find_element_by_class_name("inputstyle.password").send_keys("LUO808089lin")
    browser.find_element_by_id("login_button").click()
    browser.find_element_by_class_name("login_button").click()
    time.sleep(2)
    browser.switch_to.frame("tcaptcha_iframe")

    time.sleep(3)
    # 等待图片加载出来
    WebDriverWait(browser, 5, 0.5).until(
        EC.presence_of_element_located((By.ID, "tcaptcha_drag_button")))
    # button = browser.find_element_by_id('tcaptcha_drag_button')
    # x, y = button.location.get('x'), button.location.get('y')
    # print("location:",x,y)
    lx,ly=match("QQmail-slick")
    lz=[x for x in range(120,200,3)]
    for i in lz:
        pyautogui.moveTo(lx,ly)
        pyautogui.dragRel(i,0,duration=2,button='left')
        time.sleep(1)
        pyautogui.moveRel(-i,0)

        try:
            alert = browser.find_element_by_id('guideText').text
        except Exception as e:
            print('get alert error: %s' % e)
            alert = ''
        if alert:
            print(u'滑块位移需要调整: %s' % alert)
            sleep(3)
        else:
            print('滑块验证通过')
            browser.switch_to.parent_frame()  # 验证成功后跳回最外层页面
            break

Auto_Test.base_action importmatchの関数は次のとおりです。

def match(target, show=True):
    target_path = target.split("-")[0]
    target_name = target.split("-")[1]
    # 防止截全屏的页面没反应过来
    time.sleep(1)
    ttime_s = time.time()

    global root_dir
    appname = root_dir + '/APP_Action_Icons/'+target_path+"/"+target_name+'.png'
    appname_2 = root_dir + '/APP_Action_Icons/'+target_path+"/"+target_name+'_2.png'
    appname_3 = root_dir + '/APP_Action_Icons/'+target_path+"/"+target_name+'_3.png'
    print(appname)
    print("root_dir =", root_dir)

    ##根据桌面路径进行截屏
    hwnd = win32gui.FindWindow(None, root_dir)
    app = QApplication(sys.argv)
    screen = QApplication.primaryScreen()
    img = screen.grabWindow(hwnd).toImage()

    ##保存截屏
    root_desk = root_dir + '/Screen_Shots/Test_Screen_shots/desktop.jpg'
    img.save(root_desk)
    ##等待图片保存
    time.sleep(0.5)
    # 支持图片名为中英文名,也支持路径中英文
    imsrc = cv2.imdecode(np.fromfile(root_desk, dtype=np.uint8), -1)
    imobj = cv2.imdecode(np.fromfile(appname, dtype=np.uint8), -1)

    ##根踞名称匹配截图,只支持图片为英文名
    # imsrc = ac.imread(root_desk)
    # imobj = ac.imread(appname)

    # 匹配图标位置
    pos = ac.find_template(imsrc, imobj, 0.5,bgremove=True)
    if pos == None and os.path.exists(appname_2):
        print("第一张图标没匹配到,现匹配第二张:", end="")
        print(appname_2)
        imobj_2 = cv2.imdecode(np.fromfile(appname_2, dtype=np.uint8), -1)
        # imobj_2 = ac.imread(appname_2)
        pos = ac.find_template(imsrc, imobj_2, 0.5,bgremove=True)
    if pos == None and os.path.exists(appname_3):
        print("第二张图标没匹配到,现匹配第三张:", end="")
        print(appname_3)
        imobj_3 = cv2.imdecode(np.fromfile(appname_3, dtype=np.uint8), -1)
        # imobj_3 = ac.imread(appname_3)
        pos = ac.find_template(imsrc, imobj_3, 0.5,bgremove=True)

    # 如果第三张还未匹配到,用另一种方法重新截图
    if pos == None:
        print("2秒后重新截全屏...")
        time.sleep(2)

        ##保存截屏
        root_desk = root_dir + '/Screen_Shots/Test_Screen_shots/desktop_2.jpg'
        img = ImageGrab.grab()
        img.save(root_desk)
        ##等待图片保存
        time.sleep(0.5)
        # 支持图片名为中英文名,也支持路径中英文
        imsrc = cv2.imdecode(np.fromfile(root_desk, dtype=np.uint8), -1)
        imobj = cv2.imdecode(np.fromfile(appname, dtype=np.uint8), -1)


        # 匹配图标位置
        pos = ac.find_template(imsrc, imobj, 0.5,bgremove=True)
        if pos == None and os.path.exists(appname_2):
            print("第一张图标没匹配到,现匹配第二张:", end="")
            print(appname_2)
            imobj_2 = cv2.imdecode(np.fromfile(appname_2, dtype=np.uint8), -1)
            pos = ac.find_template(imsrc, imobj_2, 0.5,bgremove=True)
        if pos == None and os.path.exists(appname_3):
            print("第二张图标没匹配到,现匹配第三张:", end="")
            print(appname_3)
            imobj_3 = cv2.imdecode(np.fromfile(appname_3, dtype=np.uint8), -1)
            pos = ac.find_template(imsrc, imobj_3, 0.5,bgremove=True)

    if pos == None:
        print("最终没能匹配到:" + target)
    else:
        ttime_e = time.time()
        __time = ttime_e - ttime_s

        if show == True:
            try:
                show_and_save(root_desk, target, pos, __time)
            except Exception as e:
                print("保存匹配结果show_and_save这里出错,错误原因为{}".format(e))
        print(pos)
        point = pos['result']
        pyautogui.moveTo(point)
        print("匹配成功:{}".format(target))
        time.sleep(0.5)
        print(pyautogui.position())
        pyautogui.click(clicks=2)
        return point

プロテストは効果的です。ご不明な点がございましたら、私にご連絡ください。表示されたらすぐに返信いたします。
お互いにコミュニケーションを取り、お互いから学び、一緒に進歩してください!

おすすめ

転載: blog.csdn.net/liulanba/article/details/115296586