出于自动化目的,我正在创建一个在表中查找行的脚本。此行可单击并打开新标签/地址。
使用selenium,我现在能够找到表格行,单击链接,然后打开新选项卡。问题是我找不到任何方法将焦点切换到新打开的选项卡。我试图获取所有windowHandles并查看是否可以切换,但即使在新选项卡打开后,也只有1个windowHandle。
以下是我的代码:
WebElement tableRow=driver.findElement(By.xpath("/html/body/div[1]/table/tbody/tr[2]"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();", tableRow);
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
Arraylist总是包含1个单一的windowHandle,而不是2.因此我无法将焦点切换到新选项卡。有什么方法可以解决这个问题吗?
要正确切换到新打开的选项卡,您需要引导WebDriverWait以使新选项卡呈现,然后通过for()
循环,您需要遍历可用的WindowHandles并使用WindowHandle调用switchTo().window()
,而不是之前的TAB通过以下代码块:
String first_handle = driver.getWindowHandle();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();", tableRow);
new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> allHandles = driver.getWindowHandles();
for(String winHandle:allHandles)
{
if (!first_handle.equalsIgnoreCase(winHandle)
{
driver.switchTo().window(winHandle);
}
}
也许你只需要等到第二个窗口创建?也许selenium检查窗口处理速度太快?
尝试使用WebDriverWait
例:
String currentHandle = driver.getWindowHandle();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> allHandles = driver.getWindowHandles();
for (String handle : allHandles) {
if (!handle.equals(currentHandle)) driver.switchTo().window(handle);
}
如果窗口数量少于或大于2,则会出现TimeoutException
。
**Try this code:**
public static void switchToNewWindow(WebDriver driver, WebElement
causeOfNewWindow) {
// Get Handles before opening new window
Set<String> oldHandles = driver.getWindowHandles();
// Click element to open new Window
causeOfNewWindow.click();
// Get Handles after opening new window
Set<String> newHandles = driver.getWindowHandles();
for (String handle : newHandles) {
if (!oldHandles.contains(handle)) {
driver.switchTo().window(handle);
}
}
}