網站自動化測試Selenium:如何處理 New Window的情況

網站自動化測試Selenium:如何處理 New Window的情況

這篇文章主要說明對於 New Window的狀況,在網站自動化測試的時候應該如何處理?

New Window popup是導致自動化測試失敗的主要原因之一,

因此對於新視窗的出現要妥善的處理,才能夠讓自動化測試順利的執行。

最後給一個完整的測試範例說明,如何處理這樣的狀況。

測試情境

我們的測試情境:

1. 瀏覽這個網站:http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open

2. 點擊 “Try It”按鈕,會開啟另一個新視窗

這邊提到的新視窗是只透過 JavaScript 開啟的新視窗 window.open(“http://www.w3schools.com”);

3. 找到新視窗,並且將新視窗的 Window Title 印出

Java 語法範例

for (String winHandle : driver.getWindowHandles()) {
driver.switchTo().window(winHandle);
}

Python語法範例

for winHandle in driver.window_handles:
    driver.switch_to_window(winHandle )

 

 

4. 關閉新視窗

5. 回到原視窗之後,再將 Window Title 印出

System.out.println(“Window Title is: ” + driver.getTitle());

程式說明

  • 如何取得視窗的 title? 透過這個方法 driver.getTitle() ,這樣我們可以很快的驗證Selenium是否有正確的找到新的視窗。
  • 如何找到正確的視窗,這時候我們要透過 Window Handle的方法,切換到新視窗的 Window Handle。切換 Window Handle 之前必須將目前的 Window Handle 先存在parentHandle。

String parentHandle = driver.getWindowHandle();
for (String winHandle : driver.getWindowHandles()) {
driver.switchTo().window(winHandle);
}

  • 如何切回原本的視窗

driver.switchTo().window(parentHandle);

Selenium IDE 範例

如果是用Selenium IDE 可以用下列方處理。利用該新視窗連結的屬性,例如 target or href

當新視窗開啟時,利用這些屬性定位新視窗

click
link=Visit MyTest Page
 
storeAttribute
link=Visit MyTest Page@target
或是
//*[id=’newWindow’]/a@href
window1
selectWindow
${window1}
 

 

 

Python 範例程式

[pastacode lang=”java” message=”Selenium New Window Handling” highlight=”” provider=”manual”]

package mySelenium;


import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.thoughtworks.selenium.Wait;

import static org.junit.Assert.*;

public class testWinPop {
	
	public static WebDriver driver;
	
	@BeforeClass
	public static void setUp()
	{
		driver = new FirefoxDriver();
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		driver.get("http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
		driver.manage().window().maximize();
	}
	
	@Test
	public void testNewWindow()
	{
		driver.switchTo().defaultContent();
		//Activate the frame on left side using it's id attribute
		driver.switchTo().frame("iframeResult");
		System.out.println("Existing Window Title is: " + driver.getTitle());
		
		//Get an element from the frame on left side and verify it's contents
		WebElement TryIt = driver.findElement(By.xpath("//button[contains(.,'Try it')]"));
		
		//Click Try It button
		TryIt.click();
		
		String parentHandle = driver.getWindowHandle(); 
		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)
		}
		System.out.println("Newly open Window Title is: " + driver.getTitle());
		
		//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
		System.out.println("Original Window Title is: " + driver.getTitle());
		

		
	}

	
	
	@AfterClass
	public static void tearDown()
	{
		//Close the Parent Popup Window
		driver.close();
		driver.quit();
	}
}

[/pastacode]

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *