2012-12-18 4 views
11

selenium webdriverを使用してModalDialogを処理するには?私は与えられた例のモーダルダイアログに切り替えることができません

http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/showModalDialog2.htm

私は、モーダルダイアログに

enter image description here

+0

チェックselenium2.0を使用してモーダルダイアログやポップアップを処理する方法をよりよく理解するために、下記のリンク http://www.thoughtworks-studios.com/twist/2.3/help/how_do_i_handle_popup_in_selenium2.html – Hemanth

答えて

15

使用

を、次の方法の要素を取得する方法がわかりませんmodelframeに切り替える

driver.switchTo().frame("ModelFrameTitle"); 

または

driver.switchTo().activeElement() 

これは

+0

私は両方を試みましたが、これのどれも働いていませんでした。あなたはそれを試してみてください。 –

+2

@ Jasmine.Olivra、あなたは答えを受け入れましたが、同時に "*この仕事はありません"と言いました。それはあなたのために働いているのですか? –

+0

私はpythonで同じことをしていますが、私のステートメントは:driver.switch_to_window(activeElement())....ですが、私はエラーを取得しています:driver.switch_to_window(activeElement())。あなたは何かヒントを教えてくれますか? – engineer

0

あなたのオブジェクト名作業する&変数が含まれ、このコードを試してみてくださいを働くことを願っています。

Set<String> windowids = driver.getWindowHandles(); 
Iterator<String> iter= windowids.iterator(); 
for (int i = 1; i < sh.getRows(); i++) 
{ 
while(iter.hasNext()) 
{ 
System.out.println("Main Window ID :"+iter.next()); 
} 
driver.findElement(By.id("lgnLogin_UserName")).clear(); 
driver.findElement(By.id("lgnLogin_UserName")).sendKeys(sh.getCell(0, 
i).getContents()); 
driver.findElement(By.id("lgnLogin_Password")).clear(); 
driver.findElement(By.id("lgnLogin_Password")).sendKeys(sh.getCell(1, 
i).getContents()); 
driver.findElement(By.id("lgnLogin_LoginButton")).click(); 
Thread.sleep(5000L); 
      windowids = driver.getWindowHandles(); 
    iter= windowids.iterator(); 
    String main_windowID=iter.next(); 
    String tabbed_windowID=iter.next(); 
    System.out.println("Main Window ID :"+main_windowID); 
    //switch over to pop-up window 
    Thread.sleep(1000); 
    driver.switchTo().window(tabbed_windowID); 
    System.out.println("Pop-up window Title : "+driver.getTitle()); 
1

使用しているのはモデルダイアログではなく、別のウィンドウです。

は、このコードを使用します。

private static Object firstHandle; 
private static Object lastHandle; 

public static void switchToWindowsPopup() { 
    Set<String> handles = DriverManager.getCurrent().getWindowHandles(); 
    Iterator<String> itr = handles.iterator(); 
    firstHandle = itr.next(); 
    lastHandle = firstHandle; 
    while (itr.hasNext()) { 
     lastHandle = itr.next(); 
    } 
    DriverManager.getCurrent().switchTo().window(lastHandle.toString()); 
} 

public static void switchToMainWindow() { 
    DriverManager.getCurrent().switchTo().window(firstHandle.toString()); 
0

私はそれがあなたのために働く、それを試してみました。

String mainWinHander = webDriver.getWindowHandle(); 

// code for clicking button to open new window is ommited 

//Now the window opened. So here reture the handle with size = 2 
Set<String> handles = webDriver.getWindowHandles(); 

for(String handle : handles) 
{ 
    if(!mainWinHander.equals(handle)) 
    { 
     // Here will block for ever. No exception and timeout! 
     WebDriver popup = webDriver.switchTo().window(handle); 
     // do something with popup 
     popup.close(); 
    } 
} 
1

Try the below code. It is working in IE but not in FF22. Ifモーダルダイアログ期待がちょうどポップアップ二つのウィンドウ(親の一つとポップアップに1つ)になるだろうそしてちょうど待つと仮定すると、is printed in Console, then Modal dialog is identified and switched.

public class ModalDialog { 

     public static void main(String[] args) throws InterruptedException { 
      // TODO Auto-generated method stub 
      WebDriver driver = new InternetExplorerDriver(); 
      //WebDriver driver = new FirefoxDriver(); 
      driver.get("http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/showModalDialog2.htm"); 
      String parent = driver.getWindowHandle(); 
      WebDriverWait wait = new WebDriverWait(driver, 10); 
      WebElement push_to_create = wait.until(ExpectedConditions 
        .elementToBeClickable(By 
          .cssSelector("input[value='Push To Create']"))); 
      push_to_create.click(); 
      waitForWindow(driver); 
      switchToModalDialog(driver, parent); 

     } 

     public static void waitForWindow(WebDriver driver) 
       throws InterruptedException { 
      //wait until number of window handles become 2 or until 6 seconds are completed. 
      int timecount = 1; 
      do { 
       driver.getWindowHandles(); 
       Thread.sleep(200); 
       timecount++; 
       if (timecount > 30) { 
        break; 
       } 
      } while (driver.getWindowHandles().size() != 2); 

     } 

     public static void switchToModalDialog(WebDriver driver, String parent) { 
       //Switch to Modal dialog 
      if (driver.getWindowHandles().size() == 2) { 
       for (String window : driver.getWindowHandles()) { 
        if (!window.equals(parent)) { 
         driver.switchTo().window(window); 
         System.out.println("Modal dialog found"); 
         break; 
        } 
       } 
      } 
     } 

    } 
0

を見つけました2つのウィンドウが現れ、他のウィンドウハンドルを見つけてそれに切り替えます。

WebElement link = // element that will showModalDialog() 

// Click on the link, but don't wait for the document to finish 
final JavascriptExecutor executor = (JavascriptExecutor) driver; 
executor.executeScript(
    "var el=arguments[0]; setTimeout(function() { el.click(); }, 100);", 
    link); 

// wait for there to be two windows and choose the one that is 
// not the original window 
final String parentWindowHandle = driver.getWindowHandle(); 
new WebDriverWait(driver, 60, 1000) 
    .until(new Function<WebDriver, Boolean>() { 
    @Override 
    public Boolean apply(final WebDriver driver) { 
     final String[] windowHandles = 
      driver.getWindowHandles().toArray(new String[0]); 
     if (windowHandles.length != 2) { 
      return false; 
     } 
     if (windowHandles[0].equals(parentWindowHandle)) { 
      driver.switchTo().window(windowHandles[1]); 
     } else { 
      driver.switchTo().window(windowHandles[0]); 
     } 
     return true; 
    } 
}); 
関連する問題