通过 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()
不是一个好的做法。您应该更喜欢使用 WebDriverWait
和 ExpectedConditions
。使用 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 原生页面(包括“设置”页面)进行交互。
请参阅此主题以了解如何正确使用它们:
我正在使用 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()
不是一个好的做法。您应该更喜欢使用 WebDriverWait
和 ExpectedConditions
。使用 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 原生页面(包括“设置”页面)进行交互。
请参阅此主题以了解如何正确使用它们: