簡體   English   中英

如何使用硒在 chrome 中打開一個新標簽

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM