web-dev-qa-db-ja.com

セレンを使用したポップアップウィンドウの処理

リンクのウェブページをクリックするとポップアップウィンドウが開くという状況があります。また、ポップアップウィンドウが開いた後、フォーカスはポップアップウィンドウにあり、マスターウィンドウは無効になっています。そして、私はコントロールをポップアップウィンドウに移すことができません。次のコードをご覧ください。

driver.findElement(By.linkText("Click me")).click();// when this line of code is reached then a popup window opens.

System.out.println("After Clicking me"); // After the popup window opens this line of code is never executed.

親ウィンドウからポップアップウィンドウにコントロールを移すことができません。私は次のコマンドを知っています。

driver.switchTo().window("popup window");

しかし、それはあまり役に立ちません。私を助けてください。

8
coolswastik

これは、次のポップアップウィンドウで作業し、それを閉じてメインウィンドウに戻る必要があるときに使用するコードです。もちろん、この回答のために簡略化されています。元のウィンドウ(メイン)のハンドルを維持するため、他のウィンドウとの違いを生むことができます。

開発中にウィンドウが実際に開く前にコードが実行されるという問題があったため、明示的なWebDriverWaitが必要です。したがって、これは理想的な条件ではない可能性があります。

function manipulatePopUp(final WebDriver driver, final WebDriverWait wait) {
    final String mainWindowHandle = driver.getWindowHandle();
    driver.findElement(By.id("linkThatOpensPopUp")).click();

    wait.until(new ExpectedConditions<Boolean>() {
        @Override
        public Boolean apply(WebDriver d) {
            return (d.getWindowHandles().size() != 1);
        }
    });

    for (String activeHandle : driver.getWindowHandles()) {
        if (!activeHandle.equals(mainWindowHandle)) {
            driver.switchTo().window(activeHandle);
        }
    }

    driver.close();
    driver.switchTo().window(mainWindowHandle);
}
9
aimbire

driver.findElement(By.linkText( "Click me"))。click(); //このコード行に到達すると、ポップアップウィンドウが開きます。

System.out.println( "クリックした後"); //ポップアップウィンドウが開いた後、このコード行は実行されません。

プロセスはポップアップが処理されるのを待っているため、コード行は実行されません。

getWindowHandles()は、この状況で正しく機能します。

例:

//handle of the master window before clicking the link
String master = driver.getWindowHandle();

driver.findElement(By.linkText("Click me")).click();

//logic for waiting for the popup, checking the size to become greater than 1 or breaking after sometime to avoid the infinite loop.
int timeCount = 1;

do
{
   driver.getWindowHandles();
   Thread.sleep(200);
   timeCount++;
   if ( timeCount > 50 ) 
   {
       break;
   }
}
while ( driver.getWindowHandles().size == 1 );

//Assigning the handles to a set
Set<String> handles = driver.getWindowHandles();
//Switching to the popup window.
for ( String handle : handles )
{
    if(!handle.equals(master))
    {
         driver.switchTo().window(handle);
    }
}

これで、ドライバがポップアップウィンドウに切り替わります。ポップアップウィンドウにフレームがある場合は、その中の要素を識別する前にフレームに切り替える必要があります。

9
public class socialSignOn extends masterBaseClassNewSiteStage {

    @Test
    public void testSocialSignOn() throws Throwable {
        openParticularUrl("/my-lfc/join/user-details?user_type=free");

        driver.findElement(By.cssSelector("#socialSignOn > div.left.socialLogin.googleButton")).click();

        String MainWindow = driver.getWindowHandle();

        for (String activeHandle : driver.getWindowHandles()) {
            if (!activeHandle.equals(MainWindow)) {
                driver.switchTo().window(activeHandle);
            }
        }
        driver.findElement(By.cssSelector("#Email")).sendKeys("");
        driver.findElement(By.cssSelector("#next")).click();
        pauseFiveSeconds();
        driver.findElement(By.cssSelector("#Passwd")).sendKeys("");
        driver.findElement(By.cssSelector("#signIn")).click();
        pauseOneSecond();
        driver.switchTo().window(MainWindow);
        pauseTenSeconds();
        closeDriver();
    }
}
0
Danny