網站自動化測試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]