Python3とRobotFrameworkによるCAPTCHAログイン自動化

検証環境が構築されていたので、自動化テストのフローを試してみることにした。

一、CAPTCHA認識

過去の画像CAPTCHA認識工作经验としてSikuliライブラリを使用したことがあるが、更新が停止しているようなので、今回は使用を見送ることにした。CAPTCHA画像をどのように取得するかを検討し、最初はAutoItLibraryライブラリを使ってマウス操作で画像を保存することを試みた。手動で保存する場合は正常に保存されるが、AutoItLibraryを使うとHTML形式で保存されるという問題が発生し、解決できませんでした。その後、Selenium2Libraryでスクリーンショットを撮り、Pythonで画像切り抜きによってCAPTCHAを取得する方法を考え付けた。実装中にCapture Element Screenshotというキーワードを発見했는데、これは比較的新しい機能のようだ。このキーワードを使えば直接CAPTCHA画像を取得でき、Pythonで解析してCAPTCHA認識できる。RobotFrameworkのカスタムキーワード機能も活かすため、ImageOcr.pyというファイルを作成し、ImageOcrクラスを定義してviewClickCodeキーワードを追加した。ddddocrを使用して画像を解析しCAPTCHAを取得する仕組みだ。

# -*- coding:utf-8 -*-
#自動化テスト用画像CAPTCHA処理ライブラリ
import ddddocr
from robot.api.deco import keyword

class ImageOcr:
    ROBOT_LIBRARY_SCOPE = "SUITE"
    ROBOT_AUTO_KEYWORDS = False

    def __init__(self):
        pass

    @keyword('viewClickCode')
    def view_click_code(self, 画像パス):
        '''クリックCAPTCHA認識,点选すべき座標を返す'''
        try:
            認識エンジン = ddddocr.DdddOcr()
            with open(画像パス, 'rb') as ファイル:
                画像データ = ファイル.read()
            結果 = 認識エンジン.classification(画像データ)
            return 結果
        except Exception as エラー:
            print(f"認識失敗: {エラー}")
            return ''

if __name__ == '__main__':
    結果 = ImageOcr().view_click_code('D:\\imgcode\\2.png')
    print(結果)
    print(len(結果))

カスタムキーワードをRobotFrameworkのLibraryとしてインポートして使用する。

二、业务フロー

网购サイトを模拟し、ユーザーが商品を 선택して注文するプロセスをテストした。ログイン時にCAPTCHAを初めて入力的时候就错误な値を入力し、CAPTCHAを更新して再ログインするフロー도実装した。RobotFrameworkの各种キーワード(xpath、セレクタ、AutoItLibraryのマウス・キーボード操作など)の使用법을復習の意味で试了些内容。接下来直接示すスクリプトを紹介する。

*** Settings ***
Library           Selenium2Library
Library           AutoItLibrary
Library           DateTime
Library           F:/Stock/ImageOcr.py

*** Variables ***
${画像パス}        D:\\imgcode

*** Test Cases ***
ログイン流程
    Log    テスト開始
    Open Browser    https://www.baidu.com/    Google Chrome
    Maximize Browser Window
    Wait Until Element Is Visible    id=s-top-loginbtn
    Click Element    id=s-top-loginbtn
    Sleep    2
    Wait Until Element Is Visible    id=passport-login-pop-api
    Sleep    2
    Input Text    name=userName    18575533040
    Sleep    2
    Send    {ENTER}
    Send    123456
    Sleep    2
    Send    {ENTER}
    Sleep    2

商品購入流程
    Open Browser    https://dsmall.csdeshang.com/    Google Chrome
    Maximize Browser Window
    click element    class=close-fixed-suspension
    Wait Until Element Is Visible    xpath=//div[@cat_menu_id='1']
    click element    xpath=//a[contains(text(),'小米')]
    click element    xpath=//a[contains(text(),'小米 红米NOTE 5A智能拍照手机16G/32G/64G')]
    ${ウィンドウ}    Switch Window    NEW
    log    ${ウィンドウ}
    Wait Until Element Is Visible    class=dss-buy
    click element    xpath=//a[@class='increase iconfont']
    Mouse Over    id=dss-freight-selector
    sleep    2
    click element    xpath=//li[@data-index='0']
    sleep    1
    click element    xpath=//ul[@class='area-list']/li/a[contains(text(),'河南省')]
    Wait Until Element Is Visible    id=stock_city_item
    click element    xpath=//ul[@class='area-list']/li/a[contains(text(),'郑州市')]
    sleep    1
    Wait Until Element Is Visible    id=stock_area_item
    click element    xpath=//ul[@class='area-list']/li/a[contains(text(),'新郑市')]
    sleep    1
    click element    xpath=//a[@class='addcart ']
    sleep    1
    Input Text    id=member_name    buyer
    Input Password    id=member_password    123456
    Set Screenshot Directory    ${画像パス}
    ${現在時刻}    Get Current Date    UTC
    ${ファイル名時刻}    convert date    ${現在時刻}    exclude_millis=yes    result_format=%Y%m%d%H%M%S
    ${ファイル名}    Catenate    ${ファイル名時刻}.png
    Capture Element Screenshot    xpath=//img[@class='fl ml10']    ${ファイル名}
    sleep    1
    ${画像URL}    Catenate    ${画像パス}\\${ファイル名}
    ${認証コード}    viewClickCode    ${画像URL}
    log    ${認証コード}
    Input Text    id=captcha_normal_inajax    1234
    sleep    1
    click element    name=Submit
    ${エラー表示}    Run Keyword And Return Status    Element Should Be Visible    id=captcha_normal_inajax-error
    Set Variable    ${認証コード}    ''
    log    ${エラー表示}
    sleep    1
    Run Keyword If    '${エラー表示}'=='False'    click element    xpath=//img[@class='fl ml10']
    sleep    1
    Run Keyword If    '${エラー表示}'=='False'    Capture Element Screenshot    xpath=//img[@class='fl ml10']    ${ファイル名}
    sleep    2
    ${認証コード}    Run Keyword If    '${エラー表示}'=='False'    viewClickCode    ${画像URL}
    log    ${認証コード}
    sleep    2
    Run Keyword If    '${認証コード}'!=''    Input Text    id=captcha_normal_inajax    ${認証コード}
    sleep    1
    Send    {ENTER}
    sleep    5

三、動作確認

テストスクリプトを実行すると、CAPTCHA認識 Engineが画像を解析し、適切な座標または認証コードを取得できる。Selenium2LibraryとAutoItLibraryを組み合わせることで、Webアプリケーションの登录から商品选择、カートに追加、チェックアウトまでの End-to-Endテストが自动化できる。

タグ: Python robotframework Selenium 自动化テスト CAPTCHA

6月20日 16:33 投稿