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"));
}
}
当那不起作用时,我尝试了以下方法:
- 将其更改为“By.id(“q”)”
- 将值更改为“输入”
- 将其更改为“By.className(“gLFyf gsfi”)
然后我在互联网上搜索并找到了多个修复程序,其中包括:
- 使用 WebDriverWait 和 ExpectedCondition 等待元素可见
- 如果有问题的元素在框架或 iframe 中(我不能
在 google)
的给定示例中找到
所有这些对我没有任何帮助。
我什至从这个问题的解决方案中复制了代码,但找不到它:
Selenium webdriver click google search
我经常更改的唯一一件事是使用 HtmlUnitDriver 而不是 ChromeDriver 或 FirefoxDriver 等,因为我需要它 运行 在具有不同浏览器的设备上。也许这会导致问题?
如果这真的是问题所在,那么我该如何做到独立于浏览器?
我测试了使用 class name locator 和 OperaDriver
在 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);
这个问题已被问过很多次,但 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"));
}
}
当那不起作用时,我尝试了以下方法:
- 将其更改为“By.id(“q”)”
- 将值更改为“输入”
- 将其更改为“By.className(“gLFyf gsfi”)
然后我在互联网上搜索并找到了多个修复程序,其中包括:
- 使用 WebDriverWait 和 ExpectedCondition 等待元素可见
- 如果有问题的元素在框架或 iframe 中(我不能 在 google) 的给定示例中找到
所有这些对我没有任何帮助。
我什至从这个问题的解决方案中复制了代码,但找不到它: Selenium webdriver click google search
我经常更改的唯一一件事是使用 HtmlUnitDriver 而不是 ChromeDriver 或 FirefoxDriver 等,因为我需要它 运行 在具有不同浏览器的设备上。也许这会导致问题? 如果这真的是问题所在,那么我该如何做到独立于浏览器?
我测试了使用 class name locator 和 OperaDriver
在 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);