Java+Selenium3方法篇21-webdriver處理瀏覽器多視窗切換
阿新 • • 發佈:2018-12-31
經過前面兩篇文章的鋪墊,我們這篇介紹,webdriver如何處理,一個瀏覽器上多個視窗之間切換的問題。我們先腦補這樣一個測試場景,你在頁面A點選一個連線,會在新的tab視窗開啟頁面B,這個時候,你在頁面B點選一個連線,會在新的tab視窗開啟頁面C。這種情況,在測試中經常遇到,自動化中,webdriver是如何處理的呢。
我們先來看一個例項,在京東首頁,點選手機,會在新的頁面顯示手機通訊的頁面,在手機頁面點選小米,會在新的視窗開啟顯示小米手機的頁面。這個過程,剛好是頁面A到頁面B再到頁面C。我們先拋開其他的,就是先實現driver在頁面A切換到頁面B,然後切換到頁面C這個過程如何實現,在webdriver中提供了一個switch.to.window(handle)的方法。引數handle就是前面文章中提到的獲取視窗控制代碼的值。
相關程式碼如下:
上面在獲取handles過程寫了一個for迴圈,for迴圈的控制代碼和當前driver的控制代碼相等,那麼就continue,也就是結束單迴圈,什麼也不做。如果不是,那麼就呼叫切換視窗的方法,切換到第二個視窗。到了這裡,可能有人就會提出,如果我需要第二個切換到第三個呢,假如說,在判斷第三個控制代碼不等於第二個,那麼driver會不會預設切換到第三個視窗還是切換到第一個呢。如果真要這麼做,需要用到ArrayList,然後用到迭代,可能稍微變得複雜。為了避免這種複雜情況出現,我推薦這樣做,只需要把上面程式碼中的continue語句改成driver.close(),前面文章介紹過,close是關閉當前頁面。如果是頁面A點選連結開啟頁面B,那麼這個過程關閉的就是頁面A,同時把driver切換到頁面B。如果有第三個,從第二個頁面到第三個頁面也是用這樣切換方法。這裡永遠就兩個頁面之間處理的關係。一般來說,自動化也是儘量在一個頁面做完相關測試,才會切換到其他頁面。package lessons; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class ElementOpration { public static void main(String[] args) throws Exception { System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get("https://www.jd.com/"); Thread.sleep(1000); //點選京東左側選單中的 手機 WebElement phone_link = driver.findElement(By.linkText("手機")); phone_link.click(); Thread.sleep(1000); // 獲取當前頁面控制代碼 String handle = driver.getWindowHandle(); // 獲取所有頁面的控制代碼,並迴圈判斷不是當前的控制代碼 for (String handles : driver.getWindowHandles()) { if (handles.equals(handle)) continue; driver.switchTo().window(handles); } WebElement xiaomi_link = driver.findElement(By.linkText("小米")); xiaomi_link.click(); Thread.sleep(1000); } }
修改後指令碼程式碼如下:
package lessons;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class ElementOpration {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("https://www.jd.com/");
Thread.sleep(1000);
//點選京東左側選單中的 手機
WebElement phone_link = driver.findElement(By.linkText("手機"));
phone_link.click();
Thread.sleep(1000);
// 獲取當前頁面控制代碼
String handle = driver.getWindowHandle();
// 獲取所有頁面的控制代碼,並迴圈判斷不是當前的控制代碼
for (String temhandle : driver.getWindowHandles()) {
if (!temhandle.equals(handle))
driver.close();
driver.switchTo().window(temhandle);
}
WebElement xiaomi_link = driver.findElement(By.linkText("小米"));
xiaomi_link.click();
Thread.sleep(1000);
}
}
上面實現了頁面A,切換到頁面B,同時關閉頁面A,頁面B點選觸發頁面C,這個過程還需要用for迴圈判斷一次。所以關於這塊,我建議你單獨寫成一個方法,例如靜態方法,直接呼叫這個,就程式碼看起來很舒服。關於這個,後面我們會介紹,框架設計部分,肯定要寫不同的方法進行呼叫。