Vários problemas ao testar o Android Webview usando o Appium
Eu tenho um aplicativo híbrido que é basicamente apenas uma visualização da web. Aqui está o código para o teste básico:
@BeforeClass
public static void setupAppium() throws MalformedURLException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("appium-version", "1.5.3");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "6.0");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "AppiumTesterDevice");
capabilities.setCapability("app", "/work/builds/unify/app/build/outputs/apk/app-debug.apk");
capabilities.setCapability("appPackage", "com.company.unify");
capabilities.setCapability("appActivity", "AdministerActivity");
driver = new AndroidDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
}
@Test
public void CompanyUrlTest() {
driver.findElement(By.xpath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.EditText[1]")).clear();
driver.findElement(By.xpath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.EditText[1]")).sendKeys(companyserverUrl);
driver.findElement(By.xpath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[3]/android.widget.Button[2]")).click();
}
@Test
public void SimpleTest() {
driver.context("WEBVIEW_com.company.unify");
WebDriverWait wait = new WebDriverWait(driver,20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".localPickerList")));
driver.findElementByCssSelector(".localePickerList").click();
driver.findElementByCssSelector(".SPANISH_PR").click();
}
O primeiro teste funciona bem porque está apenas operando no aplicativo Android normal, sem visualização na web. Então, basta alterar o URL em um campo de texto e pressionar um botão para nos levar a esse URL na visualização da web.
O segundo teste é onde há problemas, e os problemas mudam dependendo da versão do Android e da versão do chromedriver. Eu fiz bastante pesquisa no Google e só posso concluir que há uma série interminável de bugs com appium / selendroid / chromedriver.
Baixei o Chromedriver mais recente dohttps://sites.google.com/a/chromium.org/chromedriver/downloads. E nas minhas configurações de appium, configurei o caminho do chromedriver para apontar para isso. No meu Android 6.0, recebo este erro com esta versão do ChromeDriver:
org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Can't stop process; it's not currently running (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 224 milliseconds
Build info: version: 'unknown', revision: '1969d75', time: '2016-10-18 09:43:45 -0700'
System info: host: 'company-me-m', ip: '192.168.1.154', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.11.4', java.version: '1.8.0_45'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities [{app=/work/builds/unify/app/build/outputs/apk/app-debug.apk, appPackage=com.company.unify, networkConnectionEnabled=true, warnings={}, databaseEnabled=false, deviceName=emulator-5554, platform=LINUX, deviceUDID=emulator-5554, appActivity=AdministerActivity, desired={app=/work/builds/unify/app/build/outputs/apk/app-debug.apk, appPackage=com.comany.unify, appActivity=AdministerActivity, appium-version=1.5.3, platformVersion=6.0, automationName=Appium, platformName=Android, deviceName=AppiumTesterDevice}, appium-version=1.5.3, platformVersion=6.0, webStorageEnabled=false, locationContextEnabled=false, automationName=Appium, takesScreenshot=true, javascriptEnabled=true, platformName=Android}]
Session ID: bc7100bd-2498-47d2-b0f2-3b29602c8e0d
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:40)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at io.appium.java_client.AppiumDriver.context(AppiumDriver.java:557)
at com.comapny.UnifyAppiumJunit.BasicTest.SimpleTest(BasicTest.java:57)
Sem essa versão do Chromedriver configurada nas opções do appium, recebo um erro diferente (no entanto, não sei qual executável do chromedriver está sendo usado quando não estou especificando). Aqui está esse erro:
Jan 27, 2017 3:02:39 PM org.openqa.selenium.support.ui.ExpectedConditions findElement
WARNING: WebDriverException thrown by findElement(By.cssSelector: .localPickerList)
org.openqa.selenium.NoSuchSessionException: no such session
Parece que nem mesmo estou deixando meu webview carregar nos dois casos. Enquanto o aplicativo carrega a visualização na web, o código é executado de qualquer maneira, o que parece ruim. Por que o Wait aparentemente não está fazendo nada? Isso importa?
Por fim, se eu usar meu emulador do Android 5.1.1, recebo este erro:
WebDriverException thrown by findElement org.openqa.selenium.WebDriverException: unknown error: Maximum call stack size exceeded
Alguma ideia? Eu estive batendo minha cabeça contra o Google o dia todo por causa disso.