Skip to content

Commit d304fe5

Browse files
Merge pull request #46 from testdevlab/Remote
add new methods to find and select element by option
2 parents a674664 + d2090cd commit d304fe5

7 files changed

Lines changed: 172 additions & 82 deletions

File tree

src/main/java/testUI/AndroidUtils/AndroidCapabilities.java

Lines changed: 79 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,11 @@ public class AndroidCapabilities extends Configuration {
1616
private static ADBUtils adbUtils = new ADBUtils();
1717

1818
public static DesiredCapabilities setAppAndroidCapabilities(TestUIConfiguration configuration) {
19-
if (configuration.getEmulatorName().isEmpty()
20-
&& !adbUtils.getDeviceStatus(getDevice()).equals("device")) {
21-
System.err.println("The device status is " + adbUtils.getDeviceStatus(getDevice()) +
22-
" to use usb, you must allow usb debugging for this device: " + getDevice());
23-
throw new Error();
24-
}
25-
getDevModel(configuration);
26-
String deviceVersion = Configuration.androidVersion.isEmpty() &&
27-
configuration.getEmulatorName().isEmpty() ?
28-
adbUtils.getDeviceVersion(getDevice()) : Configuration.androidVersion;
19+
retrieveDevice(configuration);
2920
// Created object of DesiredCapabilities class.
30-
DesiredCapabilities cap = new DesiredCapabilities();
21+
DesiredCapabilities cap = setChromeDriverCap(configuration);
3122
if (getDesiredCapabilities() == null) {
32-
if (configuration.getEmulatorName().isEmpty()) {
33-
cap.setCapability(MobileCapabilityType.DEVICE_NAME, getDevice());
34-
cap.setCapability(MobileCapabilityType.PLATFORM_VERSION, deviceVersion);
35-
} else {
36-
cap.setCapability(MobileCapabilityType.DEVICE_NAME,
37-
configuration.getEmulatorName());
38-
cap.setCapability(AndroidMobileCapabilityType.AVD, configuration.getEmulatorName());
39-
}
23+
cap.merge(setDeviceCapability(configuration));
4024
cap.setCapability(AndroidMobileCapabilityType.APP_WAIT_DURATION,
4125
Configuration.launchAppTimeout);
4226
if (Configuration.automationName.isEmpty()) {
@@ -45,12 +29,6 @@ public static DesiredCapabilities setAppAndroidCapabilities(TestUIConfiguration
4529
cap.setCapability(MobileCapabilityType.AUTOMATION_NAME,
4630
Configuration.automationName);
4731
}
48-
if (!Configuration.chromeDriverPath.isEmpty()) {
49-
String chromePath = Configuration.chromeDriverPath.charAt(0) == '/'
50-
? Configuration.chromeDriverPath
51-
: System.getProperty("user.dir") + "/" + Configuration.chromeDriverPath;
52-
cap.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, chromePath);
53-
}
5432
cap.setCapability(MobileCapabilityType.PLATFORM_NAME, Platform.ANDROID);
5533
if (!Configuration.appActivity.isEmpty() && !Configuration.appPackage.isEmpty()) {
5634
cap.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,
@@ -65,8 +43,7 @@ public static DesiredCapabilities setAppAndroidCapabilities(TestUIConfiguration
6543
cap.setCapability("androidInstallPath", appPath);
6644
cap.setCapability("app", appPath);
6745
}
68-
int systemPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 10;
69-
cap.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, systemPort);
46+
cap.merge(setPortCapabilities(configuration));
7047
} else {
7148
cap = getDesiredCapabilities();
7249
}
@@ -83,6 +60,43 @@ public static DesiredCapabilities setAppAndroidCapabilities(TestUIConfiguration
8360

8461
public static DesiredCapabilities setAndroidBrowserCapabilities(
8562
TestUIConfiguration configuration) {
63+
retrieveDevice(configuration);
64+
// Created object of DesiredCapabilities class.
65+
DesiredCapabilities cap = setChromeDriverCap(configuration);
66+
if (getDesiredCapabilities() == null) {
67+
cap.merge(setDeviceCapability(configuration));
68+
if (Configuration.automationName.isEmpty()) {
69+
cap.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
70+
} else {
71+
cap.setCapability(MobileCapabilityType.AUTOMATION_NAME,
72+
Configuration.automationName);
73+
}
74+
cap.merge(setPortCapabilities(configuration));
75+
cap.setCapability(MobileCapabilityType.NO_RESET, true);
76+
cap.setCapability(MobileCapabilityType.PLATFORM_NAME, Platform.ANDROID);
77+
cap.setCapability(MobileCapabilityType.BROWSER_NAME, "chrome");
78+
cap.setCapability(AndroidMobileCapabilityType.NATIVE_WEB_SCREENSHOT, true);
79+
if (!Configuration.useW3C) {
80+
ChromeOptions chromeOptions = new ChromeOptions();
81+
chromeOptions.setExperimentalOption("w3c", false);
82+
cap.merge(chromeOptions);
83+
}
84+
} else {
85+
cap = getDesiredCapabilities();
86+
}
87+
// ADD CUSTOM CAPABILITIES
88+
if (!Configuration.addMobileDesiredCapabilities.asMap().isEmpty()) {
89+
for (String key : addMobileDesiredCapabilities.asMap().keySet()) {
90+
cap.setCapability(key, addMobileDesiredCapabilities.asMap().get(key));
91+
}
92+
addMobileDesiredCapabilities = new DesiredCapabilities();
93+
}
94+
Configuration.desiredCapabilities = cap;
95+
return cap;
96+
}
97+
98+
99+
private static void retrieveDevice(TestUIConfiguration configuration) {
86100
if (Configuration.appiumUrl.isEmpty()) {
87101
if (configuration.getEmulatorName().isEmpty() && getDevices().size() == 0) {
88102
throw new Error("There is no device available to run the automation!");
@@ -107,7 +121,42 @@ public static DesiredCapabilities setAndroidBrowserCapabilities(
107121
}
108122
}
109123
}
110-
// Created object of DesiredCapabilities class.
124+
}
125+
126+
private static DesiredCapabilities setDeviceCapability(TestUIConfiguration configuration) {
127+
DesiredCapabilities cap = new DesiredCapabilities();
128+
if (configuration.getEmulatorName().isEmpty()) {
129+
String udid = configuration.getUDID().isEmpty() ? getDevice()
130+
: configuration.getUDID();
131+
cap.setCapability(MobileCapabilityType.UDID, udid);
132+
cap.setCapability(MobileCapabilityType.DEVICE_NAME, udid);
133+
} else {
134+
cap.setCapability(AndroidMobileCapabilityType.AVD, configuration.getEmulatorName());
135+
}
136+
137+
return cap;
138+
}
139+
140+
private static DesiredCapabilities setPortCapabilities(TestUIConfiguration configuration) {
141+
DesiredCapabilities cap = new DesiredCapabilities();
142+
if (configuration.getAppiumUrl().isEmpty()) {
143+
int systemPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 10;
144+
int chromeDriverPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 15;
145+
cap.setCapability("chromeDriverPort", chromeDriverPort);
146+
cap.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, systemPort);
147+
}
148+
if (Configuration.chromeDriverPort != 0) {
149+
cap.setCapability("chromeDriverPort", chromeDriverPort);
150+
}
151+
if (Configuration.systemPort != 0) {
152+
cap.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, systemPort);
153+
}
154+
155+
return cap;
156+
}
157+
158+
private static DesiredCapabilities setChromeDriverCap(
159+
TestUIConfiguration configuration) {
111160
DesiredCapabilities cap = new DesiredCapabilities();
112161
if (!configuration.getChromeDriverPath().isEmpty()) {
113162
String slash = System.getProperty("os.name").toLowerCase().contains("w") ? "\\" : "/";
@@ -116,57 +165,11 @@ public static DesiredCapabilities setAndroidBrowserCapabilities(
116165
? configuration.getChromeDriverPath()
117166
: System.getProperty("user.dir") + slash + configuration.getChromeDriverPath();
118167
cap.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, chromePath);
168+
return cap;
119169
}
120-
if (getDesiredCapabilities() == null) {
121-
if (configuration.getEmulatorName().isEmpty()) {
122-
String udid = configuration.getUDID().isEmpty() ? getDevice()
123-
: configuration.getUDID();
124-
cap.setCapability(MobileCapabilityType.UDID, udid);
125-
cap.setCapability(MobileCapabilityType.DEVICE_NAME, udid);
126-
} else {
127-
cap.setCapability(AndroidMobileCapabilityType.AVD, configuration.getEmulatorName());
128-
}
129-
if (Configuration.automationName.isEmpty()) {
130-
cap.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
131-
} else {
132-
cap.setCapability(MobileCapabilityType.AUTOMATION_NAME,
133-
Configuration.automationName);
134-
}
135-
if (configuration.getAppiumUrl().isEmpty()) {
136-
int systemPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 10;
137-
int chromeDriverPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 15;
138-
cap.setCapability("chromeDriverPort", chromeDriverPort);
139-
cap.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, systemPort);
140-
}
141-
if (Configuration.chromeDriverPort != 0) {
142-
cap.setCapability("chromeDriverPort", chromeDriverPort);
143-
}
144-
if (Configuration.systemPort != 0) {
145-
cap.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, systemPort);
146-
}
147-
cap.setCapability(MobileCapabilityType.NO_RESET, true);
148-
cap.setCapability(MobileCapabilityType.PLATFORM_NAME, Platform.ANDROID);
149-
cap.setCapability(MobileCapabilityType.BROWSER_NAME, "chrome");
150-
cap.setCapability(AndroidMobileCapabilityType.NATIVE_WEB_SCREENSHOT, true);
151-
if (!Configuration.useW3C) {
152-
ChromeOptions chromeOptions = new ChromeOptions();
153-
chromeOptions.setExperimentalOption("w3c", false);
154-
cap.merge(chromeOptions);
155-
}
156-
} else {
157-
cap = getDesiredCapabilities();
158-
}
159-
// ADD CUSTOM CAPABILITIES
160-
if (!Configuration.addMobileDesiredCapabilities.asMap().isEmpty()) {
161-
for (String key : addMobileDesiredCapabilities.asMap().keySet()) {
162-
cap.setCapability(key, addMobileDesiredCapabilities.asMap().get(key));
163-
}
164-
addMobileDesiredCapabilities = new DesiredCapabilities();
165-
}
166-
Configuration.desiredCapabilities = cap;
170+
167171
return cap;
168172
}
169-
170173
private static void getDevModel(TestUIConfiguration configuration) {
171174
String devModel;
172175
if (configuration.getEmulatorName().isEmpty()) {

src/main/java/testUI/AndroidUtils/AndroidOpen.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ public class AndroidOpen extends TestUIServer {
1717
// ANDROID APP AND BROWSER SUPPORT
1818

1919
public void openApp(TestUIConfiguration configuration) {
20-
if (((getAppiumServices().size() == 0 || !getAppiumServices().get(0).isRunning())
21-
&& desiredCapabilities == null) || getDevices().size() == 0
22-
&& configuration.getAppiumUrl().isEmpty()) {
20+
if ((((getAppiumServices().size() == 0 ||
21+
!getAppiumServices().get(0).isRunning()) && desiredCapabilities == null) ||
22+
getDevices().size() == 0) && configuration.getAppiumUrl().isEmpty()) {
2323
if (getAppiumServices().size() != 0) {
24-
stop(1);
24+
tryStop(1);
2525
}
2626
startServerAndDevice(configuration);
2727
if (getDevices().size() != 0 && configuration.isInstallMobileChromeDriver()) {

src/main/java/testUI/Utils/AppiumHelps.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,22 @@ public static boolean containsText(By element,
243243
}
244244
}
245245

246+
public static boolean containsAttribute(By element,
247+
String accessibilityId,
248+
int index,
249+
String attr,
250+
String text) {
251+
try {
252+
if (accessibilityId == null || accessibilityId.isEmpty())
253+
return ((MobileElement) getDriver().findElements(element).get(index)).
254+
getAttribute(attr).contains(text);
255+
return ((MobileElement) getMobileElementList(accessibilityId).get(index)).
256+
getText().contains(text);
257+
} catch (Exception var4) {
258+
return false;
259+
}
260+
}
261+
246262
public static boolean containsTextNoCaseSensitive(By element,
247263
String accessibilityId,
248264
String text) {

src/main/java/testUI/collections/TestUI.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,55 @@ public UIElement findByText(String text) {
382382
);
383383
}
384384

385+
public UIElement findByValue(String value) {
386+
if (!Configuration.automationType.equals(Configuration.DESKTOP_PLATFORM)) {
387+
long t= System.currentTimeMillis();
388+
long end = t+(Configuration.timeout * 1000);
389+
while(System.currentTimeMillis() < end) {
390+
for (int i = 0; i < size(); i++) {
391+
if (containsAttribute(getAppiumElement(), getAccessibilityId(), i,
392+
"value", value)) {
393+
return new Element(
394+
element,
395+
SelenideElement,
396+
iOSElement,
397+
i,
398+
true,
399+
accesibilityId,
400+
accesibilityIdiOS
401+
);
402+
}
403+
}
404+
}
405+
} else {
406+
long t= System.currentTimeMillis();
407+
long end = t+(Configuration.timeout * 1000);
408+
while(System.currentTimeMillis() < end) {
409+
for (int i = 0; i < size(); i++) {
410+
if ($$(SelenideElement).get(i)
411+
.is(com.codeborne.selenide.Condition.value(value))) {
412+
return new Element(
413+
element,
414+
SelenideElement,
415+
iOSElement,
416+
i,
417+
true,
418+
accesibilityId,
419+
accesibilityIdiOS
420+
);
421+
}
422+
}
423+
}
424+
}
425+
takeScreenshotsAllure();
426+
throw new TestUIException(
427+
"No visible element with that value '" +
428+
value +
429+
"' and this selector: " +
430+
element.toString()
431+
);
432+
}
433+
385434
public UIElement findByEnabled() {
386435
if (!Configuration.automationType.equals(Configuration.DESKTOP_PLATFORM)) {
387436
long t= System.currentTimeMillis();

src/main/java/testUI/collections/UICollection.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public interface UICollection {
3131

3232
UIElement findByText(String text);
3333

34+
UIElement findByValue(String value);
35+
3436
UIElement findByEnabled();
3537

3638
String asString();

src/main/java/testUI/elements/Element.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.apache.commons.io.FileUtils;
77
import org.openqa.selenium.*;
88
import org.openqa.selenium.interactions.touch.TouchActions;
9+
import org.openqa.selenium.support.ui.Quotes;
910
import testUI.Configuration;
1011
import testUI.BrowserLogs;
1112
import testUI.collections.UICollection;
@@ -379,6 +380,24 @@ public UIElement sendKeys(CharSequence charSequence) {
379380
return getElementObject();
380381
}
381382

383+
public UIElement selectElementByValue(String... values) {
384+
for (String value : values) {
385+
UIElement e = E(By.xpath("//option[@value = " + Quotes.escape(value) + "]"));
386+
e.waitFor(5).untilIsVisible();
387+
if (Configuration.automationType.equals(Configuration.DESKTOP_PLATFORM)) {
388+
if (!e.getSelenideElement().isSelected()) {
389+
e.getSelenideElement().click();
390+
}
391+
} else {
392+
if (!e.getMobileElement().isSelected()) {
393+
e.getMobileElement().click();
394+
}
395+
}
396+
}
397+
398+
return this;
399+
}
400+
382401
public UIElement setValueJs(String value) {
383402
long t = System.currentTimeMillis();
384403
String stringElement = getStringElement(accesibilityIdiOS, accesibilityId, iOSElement,
@@ -767,8 +786,7 @@ public Asserts should() {
767786
public UIElement saveScreenshot(String path) {
768787
if (!Configuration.automationType.equals(Configuration.DESKTOP_PLATFORM)) {
769788
if (getDrivers().size() != 0) {
770-
Configuration.driver = Configuration.driver > getDrivers().size() ?
771-
getDrivers().size() : Configuration.driver;
789+
Configuration.driver = Math.min(Configuration.driver, getDrivers().size());
772790
File scrFile = ((TakesScreenshot) getDriver()).getScreenshotAs(OutputType.FILE);
773791
try {
774792
FileUtils.copyFile(scrFile, new File(

src/main/java/testUI/elements/UIElement.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public interface UIElement {
4848

4949
UIElement setValueJs(String value);
5050

51+
UIElement selectElementByValue(String... values);
52+
5153
UIElement setValueJs(String value, boolean clickBeforeSetValue);
5254

5355
UIElement executeJsOverElement(String JsScript);

0 commit comments

Comments
 (0)