通过 Selenium 的 Chrome://settings

Going through Chrome://settings by Selenium

我正在使用 Java 和 Selenium 编写测试,我使用下面的代码进入 Chrome:setting

driverChrome.manage().window().maximize();
driverChrome.get("chrome://settings");

但是当页面打开时我找不到它的任何网页元素,例如当我试图通过此代码"show advanced setting...."找到

driverChrome.findElement(By.xpath("//a[@id='advanced-settings-expander']")).click();

它抛出一个错误说 "no such element: Unable to locate element" 我试图找到其他元素,但都失败了。我在这里看到 this post 但没有帮助。

找到下面的代码:

    driverChrome.manage().window().maximize();
    driverChrome.get("chrome://settings");
    Thread.sleep(5000);
    WebElement w = driverChrome.findElement(By
            .xpath("//iframe[@name='settings']"));      
    driverChrome = driverChrome.switchTo().frame(w);
    Thread.sleep(1000);
    while (true) {
        try {
            WebElement we = w.findElement(By
                    .xpath("//a[text()='Show advanced settings...']"));             
            if (we.isDisplayed()) {
                we.click();
                Thread.sleep(1000);
                break;
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println("=========================");
        }
    }

我还没有对此进行测试,但我获取了您的代码片段并对其进行了一些清理。试试这个,看看它是否有效。这应该很接近了。

切换到 IFRAME 上下文后,您无需像在 w.findElement() 中那样引用 IFRAME

一般来说,Thread.sleep() 不是一个好的做法。您应该更喜欢使用 WebDriverWaitExpectedConditions。使用 ExpectedConditions 查看文档,了解您可以等待的所有不同内容。我在下面的代码中使用了 .elementToBeClickable()。这是完美的,因为你想点击一个元素。 .until() returns 元素等待,因此您可以在语句末尾追加 .click() ...或者您可以将元素存储在 WebElement 变量中并使用它在别处。

driverChrome.manage().window().maximize();
driverChrome.get("chrome://settings");
WebElement w = driverChrome.findElement(By.xpath("//iframe[@name='settings']"));
driverChrome = driverChrome.switchTo().frame(w);

WebDriverWait wait = new WebDriverWait(driverChrome, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Show advanced settings...']"))).click();

// alternative example... store returned element and then click on a separate line... or use the variable elsewhere, etc.
// WebElement link = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Show advanced settings...']")));
// link.click();

您需要识别 Shadow roots 才能与许多 Chrome 原生页面(包括“设置”页面)进行交互。
请参阅此主题以了解如何正确使用它们: