私のアプリケーションはボタンをクリックすると新しいウィンドウを開き、そのウィンドウでいくつかのアクションを実行する必要があります。ただし、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のみを対象としています。
ブルースクリーン-ホームページ;灰色の画面-ポップアップ
次のようにInternetExplorer
を処理する際に注意しなければならないことがいくつかあります。
GitHub
に記載されているThere is a known issue with Selenium
について述べたように、これらは問題自体ではなく、 Required Configuration
の組み合わせセットです。InternetExplorer
を処理している間。これらの設定に注意しないと、InternetExplorer
は期待どおりに動作しない可能性があります。次の項目は、InternetExplorer v11
の適切な動作を示すために重要です。
Enhanced Protected Mode
IE10以上の場合は無効にする必要があります。このオプションは、Internet Options
ダイアログのAdvanced
タブにあります。Zoom Level
を100%に設定する必要があります。Change the size of text, apps, and other items
を100%に設定する必要があります。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 Focus
here
を参照してください。
ここで、次のように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 Clients
はWebDriver
インスタンスよりも遅れているため、頻繁に同期する必要があります。したがって、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設定を設定できなかった人々のための回避策を必要としていました。これが、機能設定の使用目的です。レジストリチェックをバイパスするだけです。ただし、この機能を使用しても根本的な問題は解決されません。プロテクトモードの境界を超えると、ハング、要素の場所が機能しない、クリックが伝播されないなどの非常に予期しない動作が発生する可能性があります。この潜在的な問題について人々に警告するために、この機能には、
Java
のINTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS
や.NET
のIntroduceInstabilityByIgnoringProtectedModeSettings
のような大きな怖い名前が付けられました。この設定を使用するとコードに潜在的な悪意が生じる可能性があることをユーザーに伝えると、使用が妨げられると本当に思っていましたが、そうではないことが判明しました。IEのプロテクトモード設定を設定でき、その機能をまだ使用している場合は、コードの安定性を危険にさらしています。それをしないでください。設定を行います。それほど難しいことではありません。
Protected Mode settings
を設定する方法は次のとおりです。
Selenium IEServerDriver not finding new windows for IE9
に関する別の議論があります。ここで、解決策は互換モードをオンにするウィンドウ処理の問題は、主にプロテクトモード設定が原因です。すべてのゾーンで保護モードを有効にするか、すべてのゾーンで保護モードを無効にして試してください。
セットとは何ですか、しかし私は次のコードでテストしました
while (true)
{
int qw = ololo.WindowHandles.Count;
string[] wh = ololo.WindowHandles.ToArray();
ololo.FindElement(By.LinkText("Помощь")).Click();
Thread.Sleep(1000);
}
そしてそれは完璧に機能しました。
IE11では、ブラウザの「プロテクトモードを有効にする」設定が重要です。オンまたはオフのいずれかになります(すべてのゾーンで)。
ドライバー機能の他の設定は重要ではありませんでした(私の場合)-以下は同じようにうまく機能しました:
caps.setCapability("ignoreZoomSetting", false);
caps.setCapability("nativeEvents", false);
caps.setCapability("ignoreProtectedModeSettings", false);