私は主にwebviewだけであるハイブリッドアプリを持っています。Appiumを使用してAndroid Webviewをテストするさまざまな問題
@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();
}
最初のテストはうまくいきます。通常のアンドロイドアプリ、ウェブビューでは動作していないためです。そのため、テキストフィールドのURLを変更し、ボタンを押してwebviewのURLに移動します。
2番目のテストは問題があり、アンドロイドのバージョンとchromedriverのバージョンによって問題が変わります。私は数多くのグーグルを行い、appium/selendroid/chromedriverのバグは無限に続くと結論づけることができます。
https://sites.google.com/a/chromium.org/chromedriver/downloadsから最新のChromedriverをダウンロードしました。私のappiumの設定では、これを指すようにchromedriverのパスを設定しました。私のアンドロイド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
どちらの場合でもWebビューの読み込みができないようです。アプリケーションがwebviewを読み込んでいる間、コードはとにかく実行されますが、これは悪いです。 Waitが一見何もしていないのはなぜですか?これは問題なのでしょうか?私は私のAndroid 5.1.1エミュレータを使用する場合
は最後に、私はこのエラーを取得する:
WebDriverException thrown by findElement org.openqa.selenium.WebDriverException: unknown error: Maximum call stack size exceeded
任意のアイデア?私はこの間、Googleから頭を叩いていた。
はどうもありがとうござい参照してください。私のグーグル・グーグルですごく驚くべきことに、Android 6.0のWebviewがAppiumを使って自動化できるという兆候は見当たりませんでした。それはまだ変だけど、私はそれを他のやり方ではできませんが、まあいいです。このメソッドを使ってテストを実行しました。 – Slims
質問に続きます:xpathまたはcontent-descを除いてWeb要素を取得する良い方法はありますか? webviewコンテキストを使用していた場合、CSSセレクタ(スーパーバギーでなければ)を使うことができました。これは、テストケース用の特別なセレクタを設定して、好きな名前を付けることができるからです。あなたの方法を使ってこのようなことをすることはできますか? – Slims
@Slims要素を見つけるのに常にxpathを使うことができます。 Xpathが最良の方法です。私はいつもそれを使う。はい! xpathの構築には、resource-id、id、name、text、content-desc、またはindexを使用できます。 – Vinod