我們正在與 Selenium webdriver 合作,為 Internet Explorer 11 進行 UI 測試。 在測試的 Web 應用程式中,會彈出幾個畫面。在一些測試中,我們最終得到了三個瀏覽器窗口,因此也得到了三個 Driver.WindowHandles。 為了從一個 WindowHandle 切換到另一個,我們期望 Driver.WindowHandles 會按照最舊的視窗在前、最新的視窗在後的方式進行排序。但事實並非如此:它完全是隨機的!
因為 windowhandle 是一個 GUID,所以我們最終建立了一個字典,其中 WindowHandle GUID 作為鍵,其值為瀏覽器視窗中載入的頁面類型的值。 但這也會導致在關閉視窗時維護字典。
對於這麼簡單的事情來說,似乎需要做很多工作。有沒有更好的解決方案?
P粉9869374572023-11-05 16:56:30
你說得非常正確:
在一次討論中,Simon 明確提到:
因此,我們將引發WebDriverWait
,然後每次開啟新分頁/視窗時收集視窗句柄,最後迭代視窗句柄和 switchTo().window( newly_opened)
根據需要:
package demo; import java.util.Iterator; import java.util.Set; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.ie.InternetExplorerDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class NEW_TAB_Handling { public static void main(String[] args) { System.setProperty("webdriver.ie.driver", "C:\Utility\BrowserDrivers\IEDriverServer.exe"); WebDriver driver = new InternetExplorerDriver(); driver.get("http://www.google.com"); String first_tab = driver.getWindowHandle(); System.out.println("Working on Google"); ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');"); WebDriverWait wait = new WebDriverWait(driver,5); wait.until(ExpectedConditions.numberOfWindowsToBe(2)); Set<String> s1 = driver.getWindowHandles(); Iterator<String> i1 = s1.iterator(); while(i1.hasNext()) { String next_tab = i1.next(); if (!first_tab.equalsIgnoreCase(next_tab)) { driver.switchTo().window(next_tab); System.out.println("Working on Facebook"); } } String second_tab = driver.getWindowHandle(); ((JavascriptExecutor) driver).executeScript("window.open('http://youtube.com/');"); wait.until(ExpectedConditions.numberOfWindowsToBe(3)); Set<String> s2 = driver.getWindowHandles(); Iterator<String> i2 = s2.iterator(); while(i2.hasNext()) { String next_tab = i2.next(); if (!first_tab.equalsIgnoreCase(next_tab) && !second_tab.equalsIgnoreCase(next_tab)) { driver.switchTo().window(next_tab); System.out.println("Working on Youtube"); } } driver.quit(); System.out.println("Quit the WebDriver instance"); } }
控制台輸出:
Working on Google Working on Facebook Working on Youtube Quit the WebDriver instance
您可以在下列位置找到基於 python 的討論在新分頁中開啟 Web Selenium Python p>#