无法自动点击移动应用中的按钮

时间:2019-08-21 07:44:00

标签: android testing mobile automated-tests

我在模拟移动应用程序中简单按钮(id = btn_sign_in)上的点击时遇到麻烦。我已经尝试了很多使用By.xpath,By.CLassname等的组合,但是我不断收到错误,如下所示。

首先,这是我的代码。

public class Firstflow {
    static DesiredCapabilities dc = new DesiredCapabilities();
    @SuppressWarnings("rawtypes")
    static AndroidDriver driver;
    static AppiumDriver <MobileElement> driver_App;
    @SuppressWarnings("rawtypes")
    public static void main(String[] args) throws MalformedURLException, InterruptedException{              
        dc.setCapability("deviceName", "emulator-5444");
        dc.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.mol.molwallet.uat");
        //dc.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "com.mol.molwallet.module.start.UserGuidance.UserGuidanceActivity");
        //dc.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "com.mol.molwallet.module.login.SignPageActivity");
        System.out.println(dc);
        dc.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "com.mol.molwallet.module.start.SplashActivity");
        dc.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, "60");
        dc.setCapability("noReset", "true");
        driver_App = new AndroidDriver<MobileElement>(new URL("http://localhost:4723/wd/hub"), dc);
        driver_App.setLogLevel(Level.INFO);
        Thread.sleep(5000); 
        String gps = driver_App.getPageSource();
        System.out.println(gps);
        //driver.findElement(By.xpath("//div/child::*[normalize-space()='SKIP']")).click();
        //driver.findElement(By.xpath("//android.widget.TextView[@text='SKIP']")).click();
        Thread.sleep(1000);
        //driver.findElement(By.xpath("//*[@text='LOG IN']")).click();
        //driver.findElement(By.xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.Button[2]")).click();
        driver_App.findElement(By.id("btn_sign_in")).click();
        driver_App.findElement(By.xpath("//*[@text='Region']")).click();
        driver_App.findElement(By.xpath("//*[@text='Malaysia']")).click();
        driver_App.findElement(By.xpath("//*[@id='etAccount']")).sendKeys("123456");
        driver_App.findElement(By.xpath("//*[@text='NEXT']")).click();
    }
}

错误信息如下:

INFO: Executed: [f0d477cf-ac78-426a-b2a8-9e08a3443e86, findElement {using=id, value=btn_sign_in}]
Exception in thread "main" org.openqa.selenium.WebDriverException: Returned value cannot be converted to WebElement: {element-6066-11e4-a52e-4f735466cecf=1, ELEMENT=1}
Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 16:57:40'
System info: host: 'RZB-MY-041', ip: '192.168.60.194', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_211'
Driver info: driver.version: AndroidDriver
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:370)
    at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:62)
    at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:413)
    at io.appium.java_client.DefaultGenericMobileDriver.findElementById(DefaultGenericMobileDriver.java:70)
    at io.appium.java_client.AppiumDriver.findElementById(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.findElementById(AndroidDriver.java:1)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:355)
    at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:58)
    at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)
    at Firstflow.main(Firstflow.java:45)
Caused by: java.lang.ClassCastException: java.util.HashMap cannot be cast to org.openqa.selenium.WebElement
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:368)
    ... 13 more

我在这里看到两个错误:

a)返回值不能转换为WebElement:{element-6066-11e4-a52e-4f735466cecf = 1,ELEMENT = 1}

b)java.util.HashMap无法转换为org.openqa.selenium.WebElement     在org.openqa.selenium.remote.RemoteWebDriver.findElement上

我正在使用Appium Server的元素检查器来获取元素的详细信息。附件是检查员结果的屏幕截图。

enter image description here

我尝试了很多findElement的语法,甚至没有将AndroidDriver更改为AppiumDriver。我真的希望这与库的任何升级或降级无关。顺便说一句,我正在使用Eclipse编写自动化测试,因此Build.gradle或Maven中没有依赖项。我只是希望对我应该使用哪种语法单击该元素提出建议。谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 您似乎正在尝试访问WebView中的元素,并且为了能够访问WebView内容,您需要explicitly configure it for debugging
  2. 使用Thread.sleep()是一种性能反模式的某种形式,请考虑使用WebDriverWait,然后查看How to use Selenium to test web applications using AJAX technology,这一概念与Appium测试相同。
  3. 我相信您还应该在驱动程序初始化例程中添加下一行:

    dc.setCapability("automationName", "uiautomator2"); 
    

    UIAutomator2是自动化Android 5或更高版本时应使用的自动化名称