java - sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 通过 Selenium 和 Java 使用 findElement(By.className())

标签 java selenium selenium-chromedriver webdriverwait linktext

当我执行以下代码时:

driver.findElement(By.className("qview-product-name")).click();

我收到以下错误

Session ID: d5df6f837164b1738991e8dc09027fe0
*** Element info: {Using=class name, value=qview-product-name}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByClassName(RemoteWebDriver.java:412)
    at org.openqa.selenium.By$ByClassName.findElement(By.java:389)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at Logins.bcLogin(Logins.java:140)
    at Exception.main(Exception.java:54)

我正在处理的网页肯定包含以下 HTML 代码,并且我已尝试等待适当的时间来执行。

<dd class="qview-product-name">
    <span class="note">1 x </span>
                    <a href="Link_here"_blank">Title</a>
            </dd>

我以为我已经非常擅长使用各种方法来定位元素,但这让我难住了。关于我应该如何进行故障排除有什么想法吗?谢谢!

最佳答案

您需要注意以下几点:

  • By.className("qview-product-name")指父<dd>标签,也许不是您想要单击的所需元素。相反,您的用例必须是单击 <a href="Link_here"_blank">Title</a>元素。
  • 根据最佳实践,在调用 click() 时您需要为 elementToBeClickable() 启动 WebDriverWait您可以使用以下任一 Locator Strategies :

  • linkText :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Title"))).click();
    
  • cssSelector :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("dd.qview-product-name a[href='Link_here']"))).click();
    
  • xpath :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//dd[@class='qview-product-name']//a[@href='Link_here' and text()='Title']"))).click();
    
<小时/>

其他注意事项

确保:

  • JDK 已升级到当前级别 JDK 8u222 .
  • Selenium 升级至当前级别 Version 3.141.59 .
  • ChromeDriver 已更新为当前 ChromeDriver v77.0级别。
  • Chrome 已更新至当前 Chrome 版本 77.0 级别。 (根据 ChromeDriver v77.0 release notes )
  • 通过IDE清理您的项目工作区,并仅使用所需的依赖项重建项目。
  • 如果您的基本Web 客户端版本太旧,请将其卸载并安装最新的 GA 和已发布版本的Web 客户端
  • 重新启动系统
  • 执行你的@Test作为非root用户。

关于java - sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 通过 Selenium 和 Java 使用 findElement(By.className()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58195202/

相关文章:

java - 如何修复 android 10 中的崩溃处理

c# - 具有 DesiredCapability 的 Selenium C# chromedriver

python - 如何在浏览器最小化时使用 selenium webdriver 执行测试

linux - "Syntax error: Unterminated quoted string"和 "org.apache.commons.exec.ExecuteException: Process exited with an error: 2 (Exit value: 2)"

python-3.x - 即使直接从 Chrome 检查复制,XPath 也无法工作

grails - 使用Chrome驱动程序时出现 Selenium 异常

java - 在没有 System.exit 的情况下关闭 Java GUI

java - 单击显示 Iframe

java - 如何编写java程序将html转换为xml

java - 无法找到指定了多个类的元素