提问者:小点点

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


我在我的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 Selenium:v3.4.0桌面OS/用于运行Appium的版本(如有必要):Windows 10 x64移动平台/测试中的版本:在Android 5.1.1上运行的Fire TV棒Real设备或模拟器/模拟器:Real设备

详细信息我在下面提供了Test1的代码。如前所述,Test2、Test3和Test4与Test1相同。下面的代码是从第二次测试开始失败的代码,即使代码在单独测试时工作正常,并且代码执行时元素肯定出现在屏幕上。但是脚本返回没有找到元素。

失败代码strTime1=river. findElementByXPath("/层次结构/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.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个答案

匿名用户

你可以尝试找到元素与相对的xpath或可访问性id?也总是最好的做法,使用最新版本的appium服务器和java客户端,因为他们是不断作出改变appium.下面是最新java客户端的链接,如果你使用maven:https://mvnrepository.com/artifact/io.appium/java-client