2017-01-27 12 views
0

У меня есть гибридное приложение, которое в основном представляет собой веб-просмотр. Вот код для основного теста:Разнообразие проблем тестирования Android Webview с использованием Appium

@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(); 
    } 

Первый тест отлично работает, потому что это просто работает на обычном андроид приложение, не WebView. Таким образом, это просто изменение URL-адреса в текстовом поле и нажатие кнопки, чтобы привести нас к этому URL-адресу в веб-просмотре.

Второй тест - там, где есть проблемы, и проблемы меняются в зависимости от версии android и версии хромированного ребра. Я сделал тонны поисковой системы и могу только заключить, что существует бесконечная серия ошибок с appium/selendroid/chromedriver.

Я загрузил последнюю версию Chromedriver от https://sites.google.com/a/chromium.org/chromedriver/downloads. И в моих настройках appium я установил путь хромированной передачи, чтобы указать на это. В моей Android 6.0 я получаю эту ошибку с этой версией 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) 

Без этой версии Chromedriver установить в настройках appium, я получаю другую ошибку (я, однако, не знаю, что chromedriver исполняемым его использования при Я не уточняю это). Вот эта ошибка:

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 

Похоже, что это даже не позволяет загружать мой веб-просмотр в обоих случаях. Пока приложение загружает веб-просмотр, код работает в любом случае, что кажется плохим. Почему Wait, похоже, ничего не делает? Это даже имеет значение?

Наконец, если я использую свой Android 5.1.1 эмулятор, я получаю эту ошибку:

WebDriverException thrown by findElement org.openqa.selenium.WebDriverException: unknown error: Maximum call stack size exceeded 

Любые идеи? Весь день я натыкался на Google google.

ответ

2

С новым UIautomator вам не нужно переключать драйвер на веб-просмотр. Он имеет встроенные возможности для идентификации элементов внутри webView.

Обновите свой Android SDK один раз.

Элементы внутри WebView будут видны в UIAutomator для версий Android версии 6.0+. Однако, как только вы автоматизируете скрипт для устройства Android 6.0+, вы можете использовать тот же скрипт для Android версии 6.0.

А также вы можете видеть элементы внутри webView на устройствах Android 6.0+, используя UIAutomator.

Для получения дополнительной информации см это link

+0

Спасибо так много. Удивительно, что во всех моих поисковых системах я не нашел никаких признаков того, что Android 6.0 Webviews можно было бы автоматизировать с помощью Appium. Это все еще странно, я не могу сделать это по-другому, но хорошо. Я получил свои тесты, используя этот метод. – Slims

+0

Следующий вопрос: есть ли хороший способ получить веб-элементы в стороне от их xpath или контента? Если бы я использовал контекст webview, я мог бы использовать селектор css (если бы он не был супер-глючит), что приятно, потому что я могу установить специальные селектора для тестовых примеров и называть их все, что захочу. Могу ли я сделать что-нибудь подобное с помощью вашего метода? – Slims

+0

@Slims Вы всегда можете использовать xpath для поиска элементов. Xpath - лучший метод. Я всегда использую его. И да! Вы можете использовать идентификатор ресурса, идентификатор, имя, текст, контент-деск или индекс для построения xpath. – Vinod