none
WebDriverを使用したIE操作でテキストフィールドなどへの書込みが抜ける RRS feed

  • 質問

  • WebDriver(IEDriverServer.exe)を使用したIE(Internet Explorer 11)の自動操作を行っているのですが、Webページ上のテキストフィールドなどへの書込みが稀に抜ける(書き込まれない)という現象が発生しております。

    原因および対処方法を教えていただきたいです。

    使用しているWebDriverのAPIは「POST /session/:sessionId/element/:id/value」です。

    2021年2月4日 6:17

すべての返信

  • f_matsu-44110さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件につきまして、3点をご確認したいことがあります。
    1.IEを自動化するためにSeleniumWebDriverを使用しているでしょうか。
    2.使用しているIEWebDriverのバージョンは何でしょうか。
    3.テキストフィールドへの書き込が抜ける場合、エラーはありますでしょうか。

    また、問題を再現できる最小限のコードスニペットをご提供いただけますでしょうか。
    それをもって、こちらでテストを行い、対処方法などを確認させていただきます。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年2月8日 8:50
    モデレータ
  • f_matsu-44110さん、こんにちは。フォーラムオペレーターのHarukaです。

    ご質問いただいた件ですが、その後いかがでしょうか。
    上記の3点をご確認いただけますでしょうか。
    追加でご確認いただいたことなどあれば、追記いただくことで回答がつきやすくなります。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年2月22日 6:42
    モデレータ
  • 返信が遅くなってしまいましたが、以下、質問への回答になります。

    1.IEを自動化するためにSeleniumWebDriverを使用しているでしょうか。

    使用しているのはIEのWebDriver(IEDriverServer.exe)になります。
    2.使用しているIEWebDriverのバージョンは何でしょうか。

    バージョンは3.14.0.0、32bit版を使用しています。


    3.テキストフィールドへの書き込が抜ける場合、エラーはありますでしょうか

    書込み時のREST APIの戻り値、WebDriverのログ共にエラーはありません。

    以下、調査用に作成したスクリプト(PowerShell)のコードスニペットになります。

    作成したスクリプトでは★1の部分をループさせるようにしており、8時間のランニングで50~100回ほどの書き込み抜け(入力欄が空白のままだったり、一部文字が抜けたり)が発生します。

    また、こちらの調査にて、セッション接続時(createSession)のCapabilitiesより、requireWindowFocusを外した場合、上記の書き込み抜けが発生しなくなりました。

    requireWindowFocusの有無で上記のような現象となるのでしょうか?

    合わせてご回答いただきたいです。

    Add-Type -AssemblyName System.Drawing

    function restApi($r, $m, $b) {
        $base = "http://127.0.0.1:${port}"
        $startTime = Get-Date
        $count = 0
        Write-Host "### [${startTime}] ${base}${r} ${m} ${b}"
        while($true) {
            $nowTime = Get-Date
            # if (($nowTime - $startTime).TotalSeconds -gt 60) {
            if ($count -ge 1) {
                Write-Host "Error Stop...(${nowTime})"
                # Write-Host "rest: ${r}"
                # Write-Host "method: ${m}"
                # Write-Host "body: ${b}"
                throw "API Response Error..."
            }
            try {
                $count += 1
                if ($b) {
                    $ret = Invoke-WebRequest -Uri "${base}${r}" -Method "${m}" -Body "${b}" -ContentType "application/json"
                } else {
                    $ret = Invoke-WebRequest -Uri "${base}${r}" -Method "${m}"
                }
                Write-Host $ret.StatusCode
                Write-Host $ret.Content
                # Write-Host ""
                if ($ret.StatusCode -eq 200){
                    # Write-Host $ret
                    return ConvertFrom-Json($ret.Content)
                } else {
                    # Write-Host $ret.StatusCode
                    # Write-Host $ret.Content
                    throw "response error code..."
                }
                # return $ret
            } catch [Exception] {
                # Write-Host "  retry..."
                Write-Host $_.Exception
                Start-Sleep -Seconds 1
            }
        }
    }

    function startWebDriver($port, $logFile) {
        $Global:port = $port
        Start-Process -FilePath "tools\IEDriverServer.exe" -ArgumentList "port=${Global:port}","log-file=${logFile}","log-level=INFO"
        Start-Sleep -Seconds 5
    }

    $sessionId = ""
    function createSession($url) {
        $initial = '{"desiredCapabilities": {"browserName": "internet explorer", "ignoreProtectedModeSettings": true, "initialBrowserUrl": "' + $url + '", "requireWindowFocus": true}}'

        $rest = restApi "/session" "Post" $initial
        $Global:sessionId = $rest.value.sessionId
        Write-Host "set session id:" $Global:sessionId
        
    }

    function changeUrl($url = $null) {
        if (!$url) {
            $url = Read-Host "URL"
        }
        $b = '{"url": "' + ${url} + '"}'
        restApi "/session/${Global:sessionId}/url" "Post" $b > $null
    }

    function getElement($type, $value) {
        $b = '{"using": "' + $type + '", "value": "' + $value + '"}'
        return restApi "/session/${Global:sessionId}/element" "Post" $b 
    }

    function actionWrite($elmId, $text) {
        $b = '{"value": "sequence", "text": "' + $text + '"}'
        restApi "/session/${Global:sessionId}/element/${elmId}/value" "Post" $b > $null
    }

    #==== main ====

    $browser = "IE"
    $url = "http://127.0.0.1:5500/07_Web/page_2/test.html"
    $port = 5555 #IE

    $date = Get-Date -Format "yyyyMMdd-HHmmss"
    $logDir = "log\${date}"
    New-Item("${logDir}\driver") -ItemType Directory -Force
    New-Item("${logDir}\image") -ItemType Directory -Force

    #★1
    $nowis = Get-Date -Format "yyyyMMdd-HHmmss"
    startWebDriver $port "${logdir}\driver\${nowis}_${browser}_WebDriver.log" > $null
    createSession $url > $null
    changeUrl $url > $null
            
    $elm = getElement "xpath" "/html/body/form/input"
    actionWrite $elm.value.psobject.properties.value "test" > $null
    #★1

    2021年6月1日 5:02
  • 追加の質問です。

    前回、こちらの調査にて、セッション接続時(createSession)のCapabilitiesより、requireWindowFocusを外した場合、上記の書き込み抜けが発生しなくなったとお伝えしていましたが、requireWindowFocusを外しかつ、IEブラウザ以外のアプリケーション(メモ帳など)が最前面化されている場合、エレメントへのクリックが抜ける場合があるという現象を検出しました。

    上記、クリック抜けについて、特定のエレメントのみで発生しているのですが、IEブラウザ起動後、クリック抜けが起こるエレメントに対するクリックの前に別のエレメントに対してクリックを行うことで、クリック抜けが起こるエレメントでもクリック抜けが発生しなくなることを確認しており、クリック抜けが発生する条件が特定しきれておりません。

    requireWindowFocusを外すことによって、本件のようにクリック抜けが発生することがあるのでしょうか?

    また、IE自動操作の安定化のため、発生条件や発生機序を教えていただきたいです。

    2021年6月9日 8:42