我正在尝试在selenium中打开一个新标签,但它不起作用。它会在同一个标签中打开网址。
代码:
cDriver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
cDriver.get(url1);
cDriver.switchTo().window(tabs.get(1));
低于例外:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
atcom.freedomoss.crowdcontrol.webharvest.plugin.selenium.RobotPlugin.executePlugin(RobotPlugin.java:187)
at org.webharvest.runtime.processors.WebHarvestPlugin.execute(WebHarvestPlugin.java:125)
at org.webharvest.runtime.processors.BaseProcessor.run(BaseProcessor.java:127)
at org.webharvest.runtime.processors.BodyProcessor.execute(BodyProcessor.java:27)
at org.webharvest.runtime.processors.WebHarvestPlugin.executeBody(WebHarvestPlugin.java:246)
at com.freedomoss.crowdcontrol.webharvest.plugin.selenium.RoboticsFlowPlugin.executePlugin(RoboticsFlowPlugin.java:98)
... 16 more
答案 0 :(得分:1)
您可以使用javascript
打开新标签页public void openNewTab() {
((JavascriptExecutor)driver).executeScript("window.open('about:blank','_blank');");
}
如果您想在新标签中执行操作,可以使用:
driver.switchTo().window();
此方法接受String作为参数。窗口句柄准确
你可以获得这样的所有句柄
driver.getWindowHandles()
。这将返回当前浏览器中的所有句柄集。
要切换到新创建的选项卡,请遍历句柄并使用switchTo()方法,如下所示:
Set<String> handles = driver.getWindowHandles();
String currentWindowHandle = driver.getWindowHandle();
for (String handle : handles) {
if (!currentWindowHandle.equals(handle)) {
driver.switchTo().window(handle);
}
}
警告:如果您有两个以上的标签,这可能会很棘手。
答案 1 :(得分:0)
代码将在新标签页中打开链接。
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
答案 2 :(得分:0)
这种方式可行:
driver.get("https://www.google.com.br/");
Robot robot = new Robot();
robot.delay(1000);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(2000);
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.get("https://br.yahoo.com/");
您通常需要将驱动程序更改为要使用的选项卡。如果需要关闭该选项卡,可以使用driver.close();但是要使用flist选项卡,您需要使用另一个swichTo。
答案 3 :(得分:0)
我在这里参加聚会有点晚了,但是我觉得这些解决方案中的许多解决方案都没有提供切换到新标签的简便机制。这是我的方法。作为奖励,它会在出现错误时切换回原始选项卡。
public static <W extends WebDriver & JavascriptExecutor> String newTab(W webDriver) {
Objects.requireNonNull(webDriver);
String currentHandle = webDriver.getWindowHandle();
String newTabHandle = null;
try {
String template = "var win=window.open('about:blank','_blank');win.document.write('<html><body style=\"display:none\" class=\"%s\"></body></html>');win.document.close();";
String className = "tab" + UUID.randomUUID().toString().replaceAll("\\W+", "");
String script = String.format(template, className);
webDriver.executeScript(script);
newTabHandle = new FluentWait<>(webDriver).pollingEvery(Duration.ofMillis(100)).until(nil -> {
Iterator<String> handleIter = webDriver.getWindowHandles().stream()
.filter(v -> !currentHandle.equals(v)).iterator();
while (handleIter.hasNext()) {
var handle = handleIter.next();
webDriver.switchTo().window(handle);
var elements = webDriver.findElements(By.cssSelector("." + className));
if (!elements.isEmpty())
return handle;
}
return null;
});
} finally {
if (newTabHandle == null)
webDriver.switchTo().window(currentHandle);
}
if (newTabHandle == null)
throw new IllegalStateException("new tab creation failed");
return newTabHandle;
}