java - org.openqa.selenium.NoSuchElementException - Selenium 测试

标签 java selenium

在 Java 中,我编写了一个 Selenium 测试来测试雅虎电影。我正在测试This Movie来自雅虎网站。但是我编写的代码(如下所示)会引发异常(如下所示)。我是 Selenium 的新手,所以请解决问题。

代码:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;



public class Tests {

    WebDriver driver;
    Wait<WebDriver> wait;
    boolean result;

    Tests() {
        driver = new FirefoxDriver();
        wait = new WebDriverWait(driver, 30);
        driver.get("http://www.yahoo.com/");
    }

    public static void main(String arg[]) {
        boolean result = new Tests().movies();
        System.out.println(result?"PASSED":"FAILED");
    }

    public boolean movies() {
        try {
            System.out.print("Testing Movies... ");
            driver.findElement(By.linkText("Movies")).click();
            driver.findElement(By.linkText("Finding Dory")).click();
            wait.until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver webDriver) {
                    return webDriver.findElement(By.className("yvp-flash-video")) != null;
                }
            });
            return driver.findElement(By.id("Main")).getText().contains("'Finding Dory' Trailer");
        }
        catch(Exception exp) {
            exp.printStackTrace();
            return false;
        }
    }
}

异常(exception):

Testing Movies... org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"link text","selector":"Finding Dory"}
Command duration or timeout: 5.08 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 16:57:40'
System info: host: 'Jahanzeb', ip: '10.99.14.207', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.7.0_79'
*** Element info: {Using=link text, value=Finding Dory}
Session ID: 5f14f1fa-85e4-471e-982f-27317dd766b7
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=WINDOWS, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=46.0.1}]
    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.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByLinkText(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByLinkText.findElement(By.java:246)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:355)
    at Tests.movies(Tests.java:189)
    at Main.main(Main.java:14)
Caused by: org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"link text","selector":"Finding Dory"}
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 16:57:40'
System info: host: 'Jahanzeb', ip: '10.99.14.207', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.7.0_79'
Driver info: driver.version: unknown
    at <anonymous class>.FirefoxDriver.prototype.findElementInternal_(file:///C:/Users/JAHANZ~1/AppData/Local/Temp/anonymous903980554428331931webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:10770)
    at <anonymous class>.FirefoxDriver.prototype.findElement(file:///C:/Users/JAHANZ~1/AppData/Local/Temp/anonymous903980554428331931webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:10779)
    at <anonymous class>.DelayedCommand.prototype.executeInternal_/h(file:///C:/Users/JAHANZ~1/AppData/Local/Temp/anonymous903980554428331931webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
    at <anonymous class>.DelayedCommand.prototype.executeInternal_(file:///C:/Users/JAHANZ~1/AppData/Local/Temp/anonymous903980554428331931webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
    at <anonymous class>.DelayedCommand.prototype.execute/<(file:///C:/Users/JAHANZ~1/AppData/Local/Temp/anonymous903980554428331931webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)
FAILED

最佳答案

我假设您正在尝试单击此页面上名为“Finding Dory”的“链接”: enter image description here

但是这不是一个链接 - 尝试手动单击它,根本无法单击它。
如果你点击它,什么也不会发生,它只是不可点击
-这只是一个简单的文本“Finding Dory”。

您可以做的就是单击“寻找多莉”文本下方名为“播放预告片”的链接。

问题在于,该页面上有许多同名“播放预告片”的链接,WebDriver不知道应该单击哪个链接,如果尝试简单的方法,则会返回错误findElement( By.linkText('播放预告片')).click();

您需要告诉 WebDriver 它应该单击位于文本“Finding Dory”下方的链接。为此,您需要比简单方法 By.linkText 更高级的定位策略。最流行的两种是使用 xpath 或 css 表达式进行定位。

首先,您需要检查此页面的结构。在浏览器中打开此页面,然后按 F12 键 - 这将打开“开发人员工具”窗口(如何使用此工具超出了此答案)。你会看到这样的东西: enter image description here

<小时/>

即:

  • DIV 标签,其中包含文本“Finding Dory”
  • 后跟包含文本“播放预告片”的 A 标记

您可以为上述内容构建一个 xpath 表达式,以这种方式查找位于包含“Finding Dory”的 DIV 标记下的链接“Play预告片”:

//div[contains(.,'Finding Dory')]/following-sibling::a[contains(.,'Play trailer')]

然后替换这行代码:

driver.findElement(By.linkText("Finding Dory")).click();

这个:

driver.findElement(
   By.xpath(
     "//div[contains(.,'Finding Dory')]/following-sibling::a[contains(.,'Play trailer')]"
)).click();

关于java - org.openqa.selenium.NoSuchElementException - Selenium 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37778640/

相关文章:

python - 无法强制脚本不在控制台中打印错误日志详细信息

java - apache poi 从 2.5 升级到 3.8 会出现 Excel 错误

java - 在java中将日期设置为日历实例

python - 减小 pyinstaller exe 的大小

java - 使用 Selenium-Java 启动具有特定主页的 Chrome

javascript - 什么是下拉 Protractor 代码

selenium - 在 docker 容器内使用 selenium hub 有什么限制吗?

java - 这个 'String#format' 模式是什么意思?

java - 如何在不被分隔的情况下获取属性?

java - 获取 java.lang.NoSuchFieldError : usingExperimentalRuntime in GAE MemCache