org.openqa.selenium.NoSuchElementException 即使元素存在

Posted

技术标签:

【中文标题】org.openqa.selenium.NoSuchElementException 即使元素存在【英文标题】:org.openqa.selenium.NoSuchElementException even when the element is present 【发布时间】:2018-09-17 18:06:43 【问题描述】:

我在我的 Appium 项目中使用 TestNG 定义了 4 个测试用例,并且所有 4 个测试用例执行几乎相同的代码执行,除了所有 4 个测试用例在我正在自动化的应用程序的不同部分上运行的不同之处。我面临的问题是在我的测试用例中,我需要找到一个元素并获取它的值,该值在测试用例 1 中运行良好,但在测试用例 2、3 和 4 中分别失败。但是,如果我注释掉测试用例 1,那么代码对于测试用例 2 可以正常工作,但对于测试用例 3 和 4 会失败。如果我单独运行测试用例 1、2、3 或 4 的代码,它们都可以工作。我无法理解为什么代码仅适用于执行中的第一个测试用例,但无法在下一个测试用例中找到元素。

请注意,我查找元素的唯一选择是使用绝对 xpath 值,因为我尝试自动化的应用程序没有定义任何其他属性。

环境 java客户端4.1.2 Appium服务器版本:v1.7.2 硒:v3.4.0 必要时用于运行 Appium 的桌面操作系统/版本:Windows 10 x64 正在测试的移动平台/版本:在 android 5.1.1 上运行的 Fire TV Stick 真实设备或模拟器/模拟器:真实设备

详情 我在下面提供了 Test1 的代码。如前所述,Test2、Test3 和 Test4 与 Test1 相同。下面的代码是从第二次测试开始失败的代码,即使代码在单独测试时工作正常,并且在执行代码时元素肯定存在于屏幕上。但是该脚本未返回任何元素。

失败代码 strTime1 = driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget. FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout[3]/android.widget.FrameLayout[3]/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.FrameLayout/ android.widget.TextView").getText();

重现问题的代码

@test //Test Case for Home tab
public void Test1_Home() throws InterruptedException, ParseException
Thread.sleep(delay3); //Wait for 10 seconds to load the content
driver.findElementByXPath("//android.widget.FrameLayout[@content-desc="Home, Button"]").click(); //Code to click Home button
Thread.sleep(delay2); //Wait for 10 seconds to load the content
((AndroidDriver) driver).pressKeyCode(23); //Code to click first video thumbnail button
Thread.sleep(delay2); //Wait for 10 seconds to load the content
//Video pause verification code starts
((AndroidDriver) driver).pressKeyCode(23); //Pause the video
Thread.sleep(1000); //Wait for 1 seconds
strTime1 = driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout[3]/android.widget.FrameLayout[3]/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.TextView").getText();
System.out.println(strTime1);
Thread.sleep(delay1); //Wait for 5 seconds
strTime2 = driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout[3]/android.widget.FrameLayout[3]/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.TextView").getText();
System.out.println(strTime2);
time1 = time.parse(strTime1);
time2 = time.parse(strTime2);
System.out.println(time1);
System.out.println(time2);
if(String.valueOf(strTime1).equals(String.valueOf(strTime2)))

boolean result = true; //Set result to true
System.out.println("Home: Video playback pause successful");
Assert.assertTrue(result); //Passes the test case

else

boolean result = false; //Set result to false
System.out.println("Home: Video playback pause failed");
Assert.assertTrue(result); //Fails the test case

//Video pause verification code ends

Thread.sleep(delay2); //Allow the video to play for 10 seconds including buffering time

异常堆栈跟踪

org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 10.13 seconds

如果需要任何进一步的信息,请告诉我。任何形式的帮助将不胜感激

【问题讨论】:

idownvotedbecau.se/noexceptiondetails --- 你有非常糟糕的错误处理。打印异常消息并继续好像没有发生任何不好的事情不是“处理”异常。 我理解您的担忧,但我不是专业的程序员,因此目前还没有处理很多事情。在清理代码之前,我想了解导致脚本失败的原因。我可能会删除不需要的代码,以便您提供帮助。谢谢。 【参考方案1】:

您能否尝试使用相对 xpath 或可访问性 id 来定位元素? 此外,最好的做法是使用最新版本的 appium 服务器和 java 客户端,因为它们会不断地对 appium 进行更改。 如果您使用的是 maven,下面是最新 Java 客户端的链接:https://mvnrepository.com/artifact/io.appium/java-client

【讨论】:

嗨 Suraj,上面已经提到,除了绝对 xpath,我没有任何选项,因为没有定义属性。

以上是关于org.openqa.selenium.NoSuchElementException 即使元素存在的主要内容,如果未能解决你的问题,请参考以下文章