[英]How to open a new tab in chrome using selenium
我正在嘗試在 selenium 中打開一個新選項卡,但它不起作用。 它會在同一選項卡中打開 url。
代碼:
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
您可以使用 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);
}
}
警告:如果您有 2 個以上的標簽,這可能會很棘手。
該代碼將在新選項卡中打開鏈接。
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
這種方式將起作用:
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。
我參加聚會有點晚了,但我覺得很多這些解決方案都沒有提供切換到新標簽的簡單機制。 這是我的方法。 作為獎勵,它會在出錯時切換回原始選項卡。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.