Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium将焦点切换到选项卡,该选项卡在单击链接后打开_Java_Selenium_Tabs_Focus - Fatal编程技术网

Java Selenium将焦点切换到选项卡,该选项卡在单击链接后打开

Java Selenium将焦点切换到选项卡,该选项卡在单击链接后打开,java,selenium,tabs,focus,Java,Selenium,Tabs,Focus,出于自动化的目的,我正在创建一个在表中查找行的脚本。此行可单击并打开一个新选项卡/地址 使用selenium,我现在可以找到表行,单击链接,打开新选项卡。问题是我找不到任何方法将焦点切换到新打开的选项卡。我尝试获取所有windowHandle并查看是否可以切换,但即使在新选项卡打开后,也只有一个windowHandle 下面是我的代码: WebElement tableRow=driver.findElement(By.xpath("/html/body/div[1]/table/tbody/t

出于自动化的目的,我正在创建一个在表中查找行的脚本。此行可单击并打开一个新选项卡/地址

使用selenium,我现在可以找到表行,单击链接,打开新选项卡。问题是我找不到任何方法将焦点切换到新打开的选项卡。我尝试获取所有windowHandle并查看是否可以切换,但即使在新选项卡打开后,也只有一个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);
    }
WebElement tableRow=driver.findElement(By.xpath(“/html/body/div[1]/table/tbody/tr[2]”);
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
js.executeScript(“参数[0]。单击();”,tableRow);
ArrayList tabs=新的ArrayList(driver.getWindowHandles());
对于(字符串winHandle:driver.getWindowHandles()){
driver.switchTo()窗口(winHandle);
}

Arraylist始终包含1个窗口句柄,而不是2个。因此,我无法将焦点切换到新选项卡。有什么办法可以解决这个问题吗?

也许你只需要等到第二个窗口创建好了再说?可能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);
}
String currentHandle=driver.getWindowHandle();
WebDriverWait wait=新的WebDriverWait(驱动程序,10);
等待.直到(预期条件.窗口数为(2));
设置allHandles=driver.getWindowHandles();
for(字符串句柄:allHandles){
如果(!handle.equals(currentHandle))driver.switchTo().window(handle);
}

如果多个窗口少于或多于2个,则会发生
TimeoutException

也许您只需等待创建第二个窗口即可?可能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);
}
String currentHandle=driver.getWindowHandle();
WebDriverWait wait=新的WebDriverWait(驱动程序,10);
等待.直到(预期条件.窗口数为(2));
设置allHandles=driver.getWindowHandles();
for(字符串句柄:allHandles){
如果(!handle.equals(currentHandle))driver.switchTo().window(handle);
}

如果多个窗口少于或多于2个,将发生
TimeoutException

要正确切换到新打开的选项卡,需要引导WebDriverWait以呈现新选项卡,然后通过
for()
循环,需要遍历可用的窗口句柄并调用
switchTo().window()
通过以下代码块使用WindowHandle,它不是上一个选项卡:

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);
    }
}
String first_handle=driver.getWindowHandle();
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
js.executeScript(“参数[0]。单击();”,tableRow);
新的WebDriverWait(驱动程序,5)。直到(预期条件。窗口数为(2));
设置allHandles=driver.getWindowHandles();
for(字符串winHandle:allHandles)
{
if(!first_handle.equalsIgnoreCase(winHandle)
{
driver.switchTo()窗口(winHandle);
}
}

要正确切换到新打开的选项卡,您需要引导WebDriverWait以呈现新选项卡,然后通过
for()
循环,您需要迭代可用的WindowHandles,并通过以下代码块使用WindowHandle调用
switchTo().window()
,该WindowHandle不是上一个选项卡:

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);
    }
}
String first_handle=driver.getWindowHandle();
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
js.executeScript(“参数[0]。单击();”,tableRow);
新的WebDriverWait(驱动程序,5)。直到(预期条件。窗口数为(2));
设置allHandles=driver.getWindowHandles();
for(字符串winHandle:allHandles)
{
if(!first_handle.equalsIgnoreCase(winHandle)
{
driver.switchTo()窗口(winHandle);
}
}
**请尝试以下代码:**
publicstaticvoidswitchtonewindow(WebDriver驱动程序,WebElement
原因(新窗口){
//在打开新窗口之前获取句柄
设置oldHandles=driver.getWindowHandles();
//单击“图元”以打开新窗口
causeOfNewWindow.click();
//打开新窗口后获取句柄
设置newHandles=driver.getWindowHandles();
for(字符串句柄:newHandles){
如果(!oldHandles.contains(句柄)){
driver.switchTo().窗口(手柄);
}
}
}
**请尝试以下代码:**
publicstaticvoidswitchtonewindow(WebDriver驱动程序,WebElement
原因(新窗口){
//在打开新窗口之前获取句柄
设置oldHandles=driver.getWindowHandles();
//单击“图元”以打开新窗口
causeOfNewWindow.click();
//打开新窗口后获取句柄
设置newHandles=driver.getWindowHandles();
for(字符串句柄:newHandles){
如果(!oldHandles.contains(句柄)){
driver.switchTo().窗口(手柄);
}
}
}

@Ryan很高兴你提出了这个问题。在讨论中,我详细解释了为什么Simon说
,虽然用于存储句柄列表的数据类型可以按插入顺序排列,但WebDriver实现迭代窗口句柄以插入它们的顺序不需要稳定。顺序是任意的。所以我会尽一切可能避免索引。我明白了。即使只有两个可能的选项卡可供选择,这是否适用?@Ryan无论有多少个窗口/选项卡2、3、4…我都希望尽可能通用present@Ryan很高兴你提出了这个问题。在讨论中,我已经详细解释了为什么Simon说
,而用于存储句柄列表的数据类型可以通过插入进行排序,WebDriver实现在窗口句柄上迭代以插入句柄的顺序不需要稳定。排序是任意的
。因此我会尽一切可能避免索引。我明白了。即使只有两个可能的选项卡,这是否适用要从中选择吗?@Ryan无论风有多大,我都希望尽可能通用