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

时间:2018-04-08 04:14:04

标签: java android appium

我在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

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

1 个答案:

答案 0 :(得分:0)

您可以尝试找到具有相对xpath或可访问性ID的元素吗? 此外,最好使用最新版本的appium服务器和Java客户端,因为它们不断对appium进行更改。 如果您使用maven:https://mvnrepository.com/artifact/io.appium/java-client

,则下面是最新Java客户端的链接