Selenium 无法通过 id/name 定位元素

Selenium unable to locate element by id/name

这个问题已被问过很多次,但 none 的答案似乎有效。我试图简单地在 google 首页 (https://google.com) 上找到搜索栏。如果查看检查器,您可以清楚地看到搜索栏的名称是“q”。

但是,我遇到了异常:

"Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element with name: q"

当我执行以下代码时:

package pack;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class Klasse  {

    public static void main(String[] args) {

        WebDriver driver = new HtmlUnitDriver();
        driver.get("https://www.google.com/");

        driver.findElement(By.name("q"));

    }
}

当那不起作用时,我尝试了以下方法:

然后我在互联网上搜索并找到了多个修复程序,其中包括:

所有这些对我没有任何帮助。

我什至从这个问题的解决方案中复制了代码,但找不到它: Selenium webdriver click google search

我经常更改的唯一一件事是使用 HtmlUnitDriver 而不是 ChromeDriver 或 FirefoxDriver 等,因为我需要它 运行 在具有不同浏览器的设备上。也许这会导致问题? 如果这真的是问题所在,那么我该如何做到独立于浏览器?

我测试了使用 class name locatorOperaDriver 在 google 上定位搜索栏的解决方案,此代码示例适用于我:

String path = ".\operadriver_win64\operadriver.exe";
OperaOptions options = new OperaOptions();
options.setBinary(new File(".\operadriver_win64\62.0.3331.72\opera.exe"));
System.setProperty("webdriver.opera.driver", path);

OperaDriver driver = new OperaDriver(options);
driver.manage().window().maximize();

driver.get("https://www.google.com/");
driver.findElement(By.className("RNNXgb"));

要测试是否确实找到了该元素,您可以通过在搜索栏中指定文本来使用 Actions class 添加检查:

Actions actions = new Actions(driver);
actions.sendKeys("test data");
actions.build().perform();

POM我有依赖:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>2.53.1</version>
</dependency>

您也可以使用 WebDriverManager 实例化浏览器。


由于 Selenium 是一个浏览器自动化工具,所以不指定浏览器是没有意义的,因为如果您在 PC 上有多个浏览器,您将面临模棱两可的情况,具体选择哪个浏览器。

您可以使用,例如为您创建 WebDriver 实例的 external class,但您仍然需要在那里指定显式配置以使其正常工作:

String path = ".\operadriver_win64\operadriver.exe";
OperaOptions options = new OperaOptions();
options.setBinary(new File(".\operadriver_win64\62.0.3331.72\opera.exe"));
System.setProperty("webdriver.opera.driver", path);