【问题标题】:Selenium unable to locate element by id/nameSelenium 无法通过 id/name 定位元素
【发布时间】:2021-11-23 18:07:18
【问题描述】:

这个问题已被问过很多次,但似乎没有一个答案有效。我试图简单地在谷歌首页(https://google.com)上找到搜索栏。如果看inspector,你可以清楚地看到,搜索栏的名字是“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"));

    }
}

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

  • 将其更改为“By.id("q")”
  • 将值更改为“输入”
  • 将其更改为“By.className("gLFyf gsfi")

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

  • 使用 WebDriverWait 和 ExpectedCondition 等待元素可见
  • 查找,如果有问题的元素在框架或 iframe 内(我不能 在给定的 google 示例中查找)

所有这些对我都没有用。

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

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

【问题讨论】:

  • 我尝试了相同的代码,它对我来说工作得很好。尝试在 chrome 驱动中运行,看看发生了什么
  • @Nandan A 这很奇怪。为什么它不能在另一台电脑上运行?无论如何,我刚刚尝试了 ChromeDriver,它给了我另一个错误消息。这次是“线程“main”中的异常 java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置;”。尽管我认为 ChromeDriver 只适用于......好吧 Chrome。但是,无论浏览器如何,我都希望能够使用它,因此 htmlUnitDriver.
  • 放个调试点试试..
  • 驱动 = 新的 HtmlUnitDriver(); driver.get("google.com/"); driver.findElement(By.name("q")).sendKeys("Test"); Thread.sleep(1000); System.out.println("Success");
  • @Nandan A 好吧,下面的代码在任何方面都没有什么不同(我确实尝试过,但它抛出了相同的异常)。对于您的其他评论,恐怕我不知道如何使用调试工具。你确定这是我的安装问题还是什么?如果有帮助,我可以提供 pom.xml 文件。

标签: java selenium selenium-webdriver selenium-grid htmlunit-driver


【解决方案1】:

我已经使用 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 类添加检查:

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);

【讨论】:

  • 也许我弄错了,但据我了解,您必须安装 Opera 才能正常工作,不是吗?而且我希望应用程序无论计算机、浏览器和操作系统如何都能正常工作(尽管最后一个不是强制性的),因此使用 htmlUnitDriver。如果 Opera 驱动程序不需要 Opera 浏览器,请说明路径应该指向什么。
  • 是的,你是对的。我已经使用Opera 作为已安装的浏览器进行了测试。我已经使用. 更新了答案以表示目录中的相对路径,但如果需要,它也可以直接与driver 文件夹的绝对路径一起使用。
  • 好的,很高兴知道如何使用 Opera 来做这件事,这肯定会在未来的项目中帮助我。但是,正如我在本例中指出的那样,无论安装哪种浏览器,它都必须工作。那么您是否偶然知道如何使用 htmlUnitDriver 编写此代码?
  • 好的,那我想我会有浏览器要求。谢谢!现在我只想知道,htmlUnitDriver 是用来做什么的
  • @mousekip,关于HtmlUnitDriver你可以阅读here
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多