web-dev-qa-db-ja.com

セレンがIE

私のアプリケーションはボタンをクリックすると新しいウィンドウを開き、そのウィンドウでいくつかのアクションを実行する必要があります。ただし、Selenium Webdriverの応答getWindowHandles()メソッドには、ウィンドウIDが1つしかありません。これは、新しいウィンドウを開いた後、getWindowHandles()の呼び出しに遅延がある場合に特に発生します。 Seleniumには既知の問題があります。 https://github.com/SeleniumHQ/Selenium/wiki/InternetExplorerDriver#required-configuration

しかし、そのための解決策でさえ私にはうまくいきません。

コードは次のとおりです

DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
RemoteWebDriver driver = new
        RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);

driver.get("https://<url>");

WebElement userName = driver.findElement(By.name("usr_name"));
userName.sendKeys("ABCD");

WebElement password = driver.findElement(By.name("usr_password"));
password.sendKeys("password");

WebElement login = driver.findElement(By.name("OK"));
login.click();  


WebElement popup= driver.findElement(By.name("popup"));
popup.click();      

Thread.sleep(1000);

Set<String> windowHandles = driver.getWindowHandles();      
System.out.println(windowHandles);

セット "windowHandles"は1つのウィンドウのみを返します:

"[fcdad457-9090-4dfd-8da1-acb9d6f73f74]" 

しかし、私が睡眠を取り除くならば。 2つのウィンドウIDを返します:

[90cc6006-0679-450c-a5b3-6602bcb41a16, 7211bbfd-2616-4460-97e7-56c0e632c3bb]

これは単なるサンプルプログラムであり、実際のアプリケーションでは間に多少の遅延が発生するため、スリープを解除できません。ご意見をお聞かせください。この問題はIE11のみを対象としています。

ブルースクリーン-ホームページ;灰色の画面-ポップアップ

enter image description here

7
Renjith

次のようにInternetExplorerを処理する際に注意しなければならないことがいくつかあります。

GitHubに記載されているThere is a known issue with Seleniumについて述べたように、これらは問題自体ではなく、 Required Configuration の組み合わせセットです。InternetExplorerを処理している間。これらの設定に注意しないと、InternetExplorerは期待どおりに動作しない可能性があります。次の項目は、InternetExplorer v11の適切な動作を示すために重要です。

  • Enhanced Protected ModeIE10以上の場合は無効にする必要があります。このオプションは、Internet OptionsダイアログのAdvancedタブにあります。
  • ネイティブマウスイベントを正しい座標に設定できるように、ブラウザZoom Level100%に設定する必要があります。
  • 表示設定でChange the size of text, apps, and other items100%に設定する必要があります。
  • IE 11の場合、ドライバーが作成したInternet Explorerのインスタンスへの接続を維持できるように、ターゲットコンピューターにレジストリエントリを設定する必要があります。

    For 32-bit Windows installations, the key you have to look in the registry is : 
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE
    
    For 64-bit Windows installations, the key is :
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE
    
    The FEATURE_BFCACHE subkey may or may not be present, and should be created if it is not present.
    
  • Native Events :ネイティブイベントを使用する利点は、JavaScriptサンドボックスに依存せず、ブラウザー内での適切なJavaScriptイベントの伝播を保証することです。ただし、現在、IEブラウザウィンドウにフォーカスがない場合、および要素にカーソルを合わせようとすると、マウスイベントにいくつかの問題があります。

  • Browser Focus :IE自体は、IEブラウザウィンドウ(WM_MOUSEDOWNおよびWM_MOUSEUP)ウィンドウにフォーカスがない場合。

  • 詳細については、Native EventsおよびBrowser Focushere を参照してください。

  • ここで、次のようにDesiredCapabilitiesクラスを介してこれらすべてのパラメーターを構成する必要があります。

    DesiredCapabilities cap = DesiredCapabilities.internetExplorer();
    cap.setCapability("ignoreProtectedModeSettings",1);
    cap.setCapability("IntroduceInstabilityByIgnoringProtectedModeSettings",true);
    cap.setCapability("nativeEvents",true);
    cap.setCapability("browserFocus",true);
    cap.setCapability("ignoreZoomSetting", true);
    cap.setCapability("requireWindowFocus","true");
    cap.setCapability("INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS", true);
    
  • Best Programmingプラクティスに従ってThread.sleep(1000);は巨大ですいいえTest Performance

  • さて、ご存知のように、Browser ClientsWebDriverインスタンスよりも遅れているため、頻繁に同期する必要があります。したがって、windowHandlesを収集する前に、次のようにWebDriverWaitを誘導する必要があります。これに対して、 detailed discussion here

    WebElement popup= driver.findElement(By.name("popup"));
    popup.click();
    new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
    Set<String> windowHandles = driver.getWindowHandles();      
    System.out.println(windowHandles);
    

更新

私はあなたのコメントから見ることができます:

"Enable Enhanced Protected Mode" is unchecked in IE options. – Renjith Jan 9 at 7:26

これは、 Protected Mode settings and the Capabilities hack の@JimEvans感覚ブログからの成果です。@ JimEvansは、明確で明確な用語でコンテキストを釘付けにします。

書き直されたIEドライバーが最初に導入されたとき、必要な保護モード設定を適用し、適切に設定されていない場合は例外をスローすることが決定されました。プロテクトモードの設定は、IEの他のほとんどすべての設定と同様に、Windowsレジストリに保存され、ブラウザがインスタンス化されるときにチェックされます。ただし、一部の誤ったIT部門では、開発者やテスターが自分のマシンで最も基本的な設定を行うことさえ不可能にしています。

ドライバーは、マシンが過度にロックされているためにこれらのIE設定を設定できなかった人々のための回避策を必要としていました。これが、機能設定の使用目的です。レジストリチェックをバイパスするだけです。ただし、この機能を使用しても根本的な問題は解決されません。プロテクトモードの境界を超えると、ハング要素の場所が機能しないクリックが伝播されないなどの非常に予期しない動作が発生する可能性があります。この潜在的な問題について人々に警告するために、この機能には、JavaINTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS.NETIntroduceInstabilityByIgnoringProtectedModeSettingsのような大きな怖い名前が付けられました。この設定を使用するとコードに潜在的な悪意が生じる可能性があることをユーザーに伝えると、使用が妨げられると本当に思っていましたが、そうではないことが判明しました。

IEのプロテクトモード設定を設定でき、その機能をまだ使用している場合は、コードの安定性を危険にさらしています。それをしないでください。設定を行います。それほど難しいことではありません。

Protected Mode settingsを設定する方法は次のとおりです。

Protected Mode IE

6
DebanjanB

ウィンドウ処理の問題は、主にプロテクトモード設定が原因です。すべてのゾーンで保護モードを有効にするか、すべてのゾーンで保護モードを無効にして試してください。

4
ArunPrakash

セットとは何ですか、しかし私は次のコードでテストしました

while (true)
            {
                int qw = ololo.WindowHandles.Count;
                string[] wh = ololo.WindowHandles.ToArray();
                ololo.FindElement(By.LinkText("Помощь")).Click();
                Thread.Sleep(1000);
            }

そしてそれは完璧に機能しました。

2
Somber

IE11では、ブラウザの「プロテクトモードを有効にする」設定が重要です。オンまたはオフのいずれかになります(すべてのゾーンで)。

ドライバー機能の他の設定は重要ではありませんでした(私の場合)-以下は同じようにうまく機能しました:

            caps.setCapability("ignoreZoomSetting", false);
                caps.setCapability("nativeEvents", false); 
                caps.setCapability("ignoreProtectedModeSettings", false);
0
Ravi