Skip to content

Commit 688185f

Browse files
authored
Update to Appium 8 and Selenium 4.33.0 +semver:breaking (#43)
* Update to Appium 8 and Selenium 4.33.0 +semver:breaking * Try to install Android SDK command-line tools * brew install --cask android-platform-tools brew install --cask android-commandlinetools * brew remove android-sdk * brew install --cask android-sdk * brew uninstall --cask temurin brew tap homebrew/cask-versions brew install --cask homebrew/cask-versions/adoptopenjdk8 * brew uninstall temurin brew install --cask temurin@8 * remove * try to reinstall android-commandlinetools * yes | sdkmanager "$(ANDROID_SDK_ID)" --licenses * yes | sdkmanager --licenses echo "y" | sdkmanager "$(ANDROID_SDK_ID)" * + sdkmanager "emulator" * nohup emulator -avd "$(ANDROID_EMU_NAME)" -no-window -no-audio -gpu swiftshader_indirect -verbose & android-wait-for-emulator * export ANDROID_HOME=/usr/local/share/android-commandlinetools export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH * /usr/local/share/android-commandlinetools * brew install --cask temurin@8 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) export PATH=$JAVA_HOME/bin:$PATH * npm install -g appium@latest * Implement execute script, remove outdated capabilities * Try to update chrome version * try to replace chrome download url * change app link to app.watch * stabilize the ApplicationManagement test, remove "--allow-insecure": "chromedriver_autodownload" * Apply pipeline changes and suggestions * Stabilize radiobutton test * fix pipeline waiting for emulator
1 parent 62c75a6 commit 688185f

File tree

19 files changed

+163
-55
lines changed

19 files changed

+163
-55
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using OpenQA.Selenium.Appium.Android;
2+
using System.Collections.Generic;
3+
4+
namespace Aquality.Appium.Mobile.Applications
5+
{
6+
/// <summary>
7+
/// Extensions for Android applications
8+
/// </summary>
9+
public static class AndroidExtensions
10+
{
11+
/// <summary>
12+
/// Starts application activity.
13+
/// </summary>
14+
/// <param name="application">Android application</param>
15+
/// <param name="appPackage">Package of the target application.</param>
16+
/// <param name="appActivity">Target activity.</param>
17+
/// <param name="stopApp">True if need to stop currently running application, false otherwise. True by default.</param>
18+
public static void StartActivity(this IMobileApplication application, string appPackage, string appActivity, bool stopApp = true)
19+
{
20+
AqualityServices.LocalizedLogger.Info("loc.application.android.activity.start", appPackage, appActivity);
21+
var args = new Dictionary<string, object>
22+
{
23+
{ "intent", $"{appPackage}/{appActivity}"},
24+
{ "stop", stopApp }
25+
};
26+
application.ExecuteScript("mobile: startActivity", args);
27+
AqualityServices.ConditionalWait.WaitFor(driver => ((AndroidDriver)driver).CurrentActivity == appActivity, message: $"Activity {appActivity} was not started");
28+
}
29+
}
30+
}

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Applications/Application.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
using OpenQA.Selenium.Appium;
88
using OpenQA.Selenium.Appium.Android;
99
using OpenQA.Selenium.Appium.Enums;
10+
using OpenQA.Selenium.Appium.iOS;
1011
using OpenQA.Selenium.Appium.Service;
1112
using System;
1213
using System.Collections.Generic;
14+
using System.Text.Json;
15+
using System.Threading;
1316

1417
namespace Aquality.Appium.Mobile.Applications
1518
{
@@ -18,7 +21,7 @@ public class Application : IMobileApplication
1821
{
1922
private readonly ILocalizedLogger localizedLogger;
2023
private readonly IApplicationProfile applicationProfile;
21-
24+
2225
private TimeSpan timeoutImplicit;
2326

2427
public Application(AppiumDriver driver, AppiumLocalService driverService = null)
@@ -52,13 +55,28 @@ protected virtual T DoWithRetry<T>(Func<T> function) => AqualityServices.Get<IAc
5255
protected virtual void DoWithRetry(Action action) => AqualityServices.Get<IActionRetrier>()
5356
.DoWithRetry(action, new[] { typeof(WebDriverException) });
5457

58+
public object ExecuteScript(string script, Dictionary<string, object> args = null)
59+
{
60+
return DoWithRetry(() =>
61+
{
62+
var argsString = args == null ? string.Empty : JsonSerializer.SerializeToNode(args).ToString();
63+
localizedLogger.Info("loc.application.execute.script", script + argsString);
64+
var result = Driver.ExecuteScript(script, args);
65+
if (result != null)
66+
{
67+
localizedLogger.Info("loc.application.script.result", JsonSerializer.SerializeToNode(result).ToString());
68+
}
69+
return result;
70+
});
71+
}
72+
5573
public string Id
5674
{
5775
get
5876
{
5977
return DoWithRetry(() => PlatformName.Android == PlatformName
6078
? ((AndroidDriver)Driver).CurrentPackage
61-
: ((Dictionary<string, object>)Driver.ExecuteScript("mobile: activeAppInfo"))["bundleId"].ToString());
79+
: ((Dictionary<string, object>)ExecuteScript("mobile: activeAppInfo"))["bundleId"].ToString());
6280
}
6381
}
6482

@@ -86,7 +104,7 @@ public bool Terminate(TimeSpan? timeout = null)
86104
public bool Terminate(string appId, TimeSpan? timeout = null)
87105
{
88106
localizedLogger.Info("loc.application.terminate", appId);
89-
return DoWithRetry(() => Driver.TerminateApp(appId,
107+
return DoWithRetry(() => Driver.TerminateApp(appId,
90108
timeout ?? AqualityServices.Get<ITimeoutConfiguration>().Condition));
91109
}
92110

@@ -142,7 +160,7 @@ public void Activate(string appId, TimeSpan? timeout = null)
142160
public AppState GetState(string appId)
143161
{
144162
localizedLogger.Info("loc.application.get.state", appId);
145-
var state = DoWithRetry(() => Driver.GetAppState(appId));
163+
var state = PlatformName.Android == PlatformName ? ((AndroidDriver)Driver).GetAppState(appId) : ((IOSDriver)Driver).GetAppState(appId);
146164
localizedLogger.Info("loc.application.state", state);
147165
return state;
148166
}

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Applications/ApplicationFactory.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ protected class CustomActionRetrier : ActionRetrier
5656
"stream was destroyed",
5757
"invalid or unrecognized response",
5858
"has been expired",
59-
"unknown server-side error"
59+
"unknown server-side error",
60+
"response to the /status api is not valid"
6061
};
6162

6263
public CustomActionRetrier()
@@ -68,7 +69,8 @@ protected override bool IsExceptionHandled(IEnumerable<Type> handledExceptions,
6869
{
6970
var exceptions = new List<Type>(handledExceptions ?? new List<Type>())
7071
{
71-
typeof(WebDriverException)
72+
typeof(WebDriverException),
73+
typeof(UnknownErrorException)
7274
};
7375
return base.IsExceptionHandled(exceptions, exception)
7476
&& handledErrorMessages.Any(message => exception.Message.ToLower().Contains(message));

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Applications/IMobileApplication.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using OpenQA.Selenium.Appium.Enums;
44
using OpenQA.Selenium.Appium.Service;
55
using System;
6+
using System.Collections.Generic;
67

78
namespace Aquality.Appium.Mobile.Applications
89
{
@@ -16,6 +17,14 @@ public interface IMobileApplication : IApplication
1617
/// </summary>
1718
new AppiumDriver Driver { get; }
1819

20+
/// <summary>
21+
/// Execute application script
22+
/// </summary>
23+
/// <param name="script">script</param>
24+
/// <param name="args">parameters</param>
25+
/// <returns></returns>
26+
object ExecuteScript(string script, Dictionary<string, object> args = null);
27+
1928
/// <summary>
2029
/// Quits application driver and disposes <see cref="DriverService"/> if it not null.
2130
/// </summary>

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Aquality.Appium.Mobile.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
</ItemGroup>
5050

5151
<ItemGroup>
52-
<PackageReference Include="Appium.WebDriver" Version="5.1.0" />
53-
<PackageReference Include="Aquality.Selenium.Core" Version="3.0.12" />
52+
<PackageReference Include="Appium.WebDriver" Version="8.0.0" />
53+
<PackageReference Include="Aquality.Selenium.Core" Version="3.3.0" />
5454
</ItemGroup>
5555

5656
</Project>

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Aquality.Appium.Mobile.xml

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Resources/Localization/be.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"loc.application.ready": "Праграма на платформе '{0}' гатовая...",
1515
"loc.application.implicit.timeout": "Задаем таймаўт implicit(няяўнага) чакання: '{0}' сек.",
1616
"loc.application.android.activity.start": "Стартуем '{0}' актыўнасць Android праграмы ў пакеце '{1}'",
17+
"loc.application.execute.script": "Выконваем скрыпт '{0}'",
18+
"loc.application.script.result": "Вынік выканання скрыпту: '{0}'",
1719
"loc.button": "Кнопка",
1820
"loc.checkbox": "Чэкбокс",
1921
"loc.checkable.is.checked": "Атрымліваем стан",

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Resources/Localization/en.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"loc.application.ready": "Application on platform '{0}' is ready...",
1515
"loc.application.implicit.timeout": "Set implicit timeout '{0}' in seconds",
1616
"loc.application.android.activity.start": "Starting the '{0}' activity of the Android app at package '{1}'",
17+
"loc.application.execute.script": "Executing script '{0}'",
18+
"loc.application.script.result": "Script result: '{0}'",
1719
"loc.button": "Button",
1820
"loc.checkbox": "CheckBox",
1921
"loc.checkable.is.checked": "Getting state",

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Resources/Localization/pl.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"loc.application.ready": "Aplikacja na platformie '{0}' jest gotowa...",
1515
"loc.application.implicit.timeout": "Ustawianie implicit(niejawny) limitu czasu '{0}' sek.",
1616
"loc.application.android.activity.start": "Rozpoczęcie aktywności '{0}' aplikacji Android w pakiecie '{1}'",
17+
"loc.application.execute.script": "Wykonywanie skryptu: '{0}'",
18+
"loc.application.script.result": "Wynik wykonania skryptu: '{0}'",
1719
"loc.button": "Przycisk",
1820
"loc.checkbox": "Pole wyboru",
1921
"loc.checkable.is.checked": "Uzyskiwanie stanu",

Aquality.Appium.Mobile/src/Aquality.Appium.Mobile/Resources/Localization/ru.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"loc.application.ready": "Приложение на платформе '{0}' готово...",
1515
"loc.application.implicit.timeout": "Установка таймаута implicit(неявного) ожидания: '{0}' сек.",
1616
"loc.application.android.activity.start": "Старт активности '{0}' Android приложения в пакете '{1}'",
17+
"loc.application.execute.script": "Исполнение скрипта '{0}'",
18+
"loc.application.script.result": "Результат исполнения скрипта: '{0}'",
1719
"loc.button": "Кнопка",
1820
"loc.checkbox": "Чекбокс",
1921
"loc.checkable.is.checked": "Получение состояния",

0 commit comments

Comments
 (0)