2013-10-01 20 views
14

Đây là mã của tôi:Làm cách nào để xử lý cửa sổ mới trong Selenium WebDriver bằng Java?

driver.findElement(By.id("ImageButton5")).click(); 
//Thread.sleep(3000); 
String winHandleBefore = driver.getWindowHandle(); 
driver.switchTo().window(winHandleBefore); 
driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219"); 

Bây giờ tôi có lỗi tiếp theo:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to find element with id == txtEnterCptCode (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 404 milliseconds.

Bất kỳ ý tưởng?

Trả lời

33

Dường như bạn không thực sự chuyển sang bất kỳ cửa sổ mới nào. Bạn có nghĩa vụ có được cửa sổ xử lý của cửa sổ ban đầu của bạn, lưu rằng, sau đó nhận được xử lý cửa sổ của cửa sổ mới và chuyển sang đó. Khi bạn đã hoàn tất với cửa sổ mới, bạn cần phải đóng cửa sổ, sau đó chuyển về cửa sổ ban đầu. Xem mẫu của tôi dưới đây:

ví dụ:

String parentHandle = driver.getWindowHandle(); // get the current window handle 
driver.findElement(By.xpath("//*[@id='someXpath']")).click(); // click some link that opens a new window 

for (String winHandle : driver.getWindowHandles()) { 
    driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle (that's your newly opened window) 
} 

//code to do something on new window 

driver.close(); // close newly opened window when done with it 
driver.switchTo().window(parentHandle); // switch back to the original window 
+0

Bây giờ tôi không thể nhập các giá trị trong hộp văn bản của cửa sổ mới thông qua mã của tôi.String parentHandle = driver.getWindowHandle(); \t \t \t driver.findElement (By.id ("ImageButton5")). Nhấp(); cho (Chuỗi winHandle: driver.getWindowHandles()) { \t \t driver.switchTo(). Window (winHandle); \t \t \t \t \t \t Thread.sleep (3000); \t \t \t driver.findElement (By.id ("txtEnterCptCode")). SendKeys ("99219"); driver.findElement (By.id ("chklstAllprocedure_0")). Click(); Lỗi tôi nhận được là không thể tìm thấy phần tử textbox trong cửa sổ mới được mở. Bạn có thể giúp tôi không? –

+0

@Arun Kumar: có lẽ webDriver đang cố gắng tìm phần tử trước khi trang được tải đầy đủ? Thead.sleep không hiệu quả vì tất cả những gì cần làm là chờ một vài giây trước khi chạy các dòng mã tiếp theo. Hãy thử lớp WebDriverWait.:::: WebDriverWait wait = new WebDriverWait (trình điều khiển, 1000); WebElement element = wait.until (Điều kiện dự kiến.visibilityOfElementLocated (By.id ("txtEnterCptCode"))); element.sendKeys ("99219"); – CODEBLACK

+0

WebDriverWait sẽ đợi cho đến khi phần tử được chỉ định của bạn hiển thị ... và khi nó hiển thị, nó sẽ tiếp tục chạy mã của bạn ... – CODEBLACK

2

Tôi có một phương pháp hữu ích để chuyển sang cửa sổ cần thiết như hình dưới đây

public class Utility 
{ 
    public static WebDriver getHandleToWindow(String title){ 

     //parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle. 
     WebDriver popup = null; 
     Set<String> windowIterator = WebDriverInitialize.getDriver().getWindowHandles(); 
     System.err.println("No of windows : " + windowIterator.size()); 
     for (String s : windowIterator) { 
      String windowHandle = s; 
      popup = WebDriverInitialize.getDriver().switchTo().window(windowHandle); 
      System.out.println("Window Title : " + popup.getTitle()); 
      System.out.println("Window Url : " + popup.getCurrentUrl()); 
      if (popup.getTitle().equals(title)){ 
       System.out.println("Selected Window Title : " + popup.getTitle()); 
       return popup; 
      } 

     } 
       System.out.println("Window Title :" + popup.getTitle()); 
       System.out.println(); 
      return popup; 
     } 
} 

Nó sẽ đưa bạn đến cửa sổ mong muốn một lần tiêu đề của cửa sổ được thông qua như là tham số. Trong trường hợp của bạn, bạn có thể làm.

Webdriver childDriver = Utility.getHandleToWindow("titleOfChildWindow"); 

và sau đó lại chuyển sang cửa sổ cha mẹ sử dụng cùng một phương pháp

Webdriver parentDriver = Utility.getHandleToWindow("titleOfParentWindow");

Phương pháp này hoạt động hiệu quả khi đối phó với nhiều cửa sổ.

+0

Không có điểm nào trong việc trả lại phiên bản 'WebDriver' vì nó giống với trường hợp bạn đang sử dụng. – JeffC

0

tôi có một chương trình mẫu cho việc này:

public class BrowserBackForward {

/** 
* @param args 
* @throws InterruptedException 
*/ 
public static void main(String[] args) throws InterruptedException { 
    WebDriver driver = new FirefoxDriver(); 
    driver.get("http://seleniumhq.org/"); 
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    //maximize the window 
    driver.manage().window().maximize(); 

    driver.findElement(By.linkText("Documentation")).click(); 
    System.out.println(driver.getCurrentUrl()); 
    driver.navigate().back(); 
    System.out.println(driver.getCurrentUrl()); 
    Thread.sleep(30000); 
    driver.navigate().forward(); 
    System.out.println("Forward"); 
    Thread.sleep(30000); 
    driver.navigate().refresh(); 

} 

}

+1

Tại sao giấc ngủ dài? Đó thực sự là thực hành tồi. –

+0

Đó chỉ là một ví dụ. –

1
   string BaseWindow = driver.CurrentWindowHandle; 
       ReadOnlyCollection<string> handles = driver.WindowHandles; 
       foreach (string handle in handles) 
       { 
        if (handle != BaseWindow) 
        { 
         string title = driver.SwitchTo().Window(handle).Title; 
         Thread.Sleep(3000); 
         driver.SwitchTo().Window(handle).Title.Equals(title); 
         Thread.Sleep(3000); 
        } 
       } 
-1
Set<String> windows = driver.getWindowHandles(); 
Iterator<String> itr = windows.iterator(); 

//patName will provide you parent window 
String patName = itr.next(); 

//chldName will provide you child window 
String chldName = itr.next(); 

//Switch to child window 
driver.switchto().window(chldName); 

//Do normal selenium code for performing action in child window 

//To come back to parent window 
driver.switchto().window(patName); 
0

tôi đã gặp một số vấn đề với windowhandle và đã thử này. cái này phù hợp với tôi.

Các vấn đề liên quan