2017-04-10 18 views
0

getWindowHandlesがポップアップのハンドルを取得する正しい方法であるかどうかはわかりません。これは、親ハンドルのみで、子ハンドルではないためです。Selenium Java:ポップアップへのハンドルを取得できません

for (String handle : driver.getWindowHandles()) { 
      driver.switchTo().window(handle); 
} 
WebDriverWait waitforEle = new WebDriverWait(driver, 300); 
waitforEle.until(ExpectedConditions.visibilityOfAllElementsLocatedBy 
(By.xpath("//*[@id='blah']"))); 

上記の方法が間違っている場合は、どのようにポップアップを処理するか教えてください。

ありがとう、 Tickbox。

+1

をあなたが見ることができます次のようにします: 'Alert alert = driver.switchTo()。alert(); alert.accept(); 'もしそうでなければ、HTMLコードやURLを投稿してください。 – kushal

+0

@kushalツコンテキストメニューがHTMLページのように表示される場合は、HTMLであり、JSの警告ではありません。 – JeffC

+0

うん、@Tickboxはこれを認識していないかもしれない。 – kushal

答えて

0

getWindowHandles()メソッドには、開いているブラウザウィンドウまたはタブのIDが表示されます。ポップアップのロケータで1つのWebElementを待つだけです。

WebDriverWait wait = new WebDriverWait(driver, 300); 
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='blah']")); 
+0

しかし、ブラウザのウィンドウやタブではありません。そのdivのポップアップ。 – Tickbox

+1

それは私が言っていることです。 getWindowHandles()は必要ありません。ポップアップのロケータを持つ要素の存在を待つだけです。 – SanchelliosProg

+0

おそらく待たなければならないでしょう。たとえ '$ x" // * [@ id = 'blah'] ''を使ってchromeのコンソールセクションをチェックして、その要素が同じhtmlページの一部であるかどうかを確認することができますo/wはiframeの一部です – kushal

0

ポップアップは、アラートを使用することである場合:

Alert alert =driver.switchTo().alert(); alert.accept(); 

か、アプリケーションポップアップであるならば、使用します。そのポップアップがそれまでに警報であれば

String parentWinHandle = driver.getWindowHandle(); 
//Click the button or link which populates the window 
driver.findElement(By.id(actionBtn)).click(); 
Thread.sleep(5000); 
Set<?> popupHandles = driver.getWindowHandles(); 
//SOP *popupHandles* 
Iterator<?> iterator = popupHandles.iterator(); 
while(iterator.hasNext()) 
    { 
    String popupHandle = iterator.next().toString(); 
    if(!popupHandle.contains(parentWinHandle)) { 
     driver.switchTo().window(popupHandle); 
     Thread.sleep(3000); 
     //Perform the operation you want to do 
     driver.switchTo().window(parentWinHandle); 
    } 
} 
+1

待つ必要がある場合は、誰でもスレッドクラスを使用することをお勧めしません。これらのニーズにWebDriverWaitクラスを使用するほうがはるかに優れています。 – SanchelliosProg

+0

@SanchelliosProg私は、 'Thread.sleep();'を使って同意するのは良いことではありません。 – Ashish

+0

しかし、私のテストケースのシナリオは5秒間待たなければならなかった。その間、画面は5秒間のカウントダウンを実行する。私はそれを削除せずに投稿したことが悪いです。 – Ashish

関連する問題