Skip to content
This repository has been archived by the owner on May 29, 2023. It is now read-only.

Add appium collection condition and appium condition classes #135

Merged
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,34 @@ boolean isAndroid = AppiumDriverRunner.isAndroidDriver();
boolean isIos = AppiumDriverRunner.isIosDriver();
```

4. Rich Assertions

In Appium, it is common that we want to extract values from different attributes.

_Appium way:_
```java
public String getAttribute(){
return driver instance of AndroidDriver
? mobileELement.getAttribute("content-desc")
: mobileELement.getAttribute("name")
}

//Assertion in test
Assertions.assertThat(getAttribute()).isEqualTo("expected-value")
```
_Selenide-Appium way:_
```
$(mobileElement)
.shouldHave(AppiumCondition.attributeWithValue("content-desc", "name", "expected-value"));
```

We can also assert collection
```java
List<String> expectedList = Arrays.asList("API Demos", "KeyEventText", "Linkify", "LogTextBox", "Marquee", "Unicode");

$$(AppiumBy.xpath("//android.widget.TextView"))
.shouldHave(AppiumCollectionCondition.exactAttributes("text", "name", expectedList));
```
### Changelog

Here is [CHANGELOG](https://github.com/selenide/selenide-appium/blob/main/CHANGELOG)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.codeborne.selenide.appium;

import com.codeborne.selenide.CollectionCondition;
import com.codeborne.selenide.appium.conditions.AppiumAttributeValues;

import java.util.List;

public class AppiumCollectionCondition {

private AppiumCollectionCondition() {
}

public static CollectionCondition exactAttributes(String androidAttributeName, String iosAttributeName,
String... expectedAttributeValues) {
return new AppiumAttributeValues(androidAttributeName, iosAttributeName, expectedAttributeValues);
}

public static CollectionCondition exactAttributes(String androidAttributeName, String iosAttributeName,
List<String> expectedAttributeValues) {
return new AppiumAttributeValues(androidAttributeName, iosAttributeName, expectedAttributeValues);
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/codeborne/selenide/appium/AppiumCondition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.codeborne.selenide.appium;

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.conditions.AttributeWithValue;

public class AppiumCondition {

private AppiumCondition() {
}

public static Condition attributeWithValue(String androidAttributeName, String iosAttributeName, String expectedAttributeValue) {
return AppiumDriverRunner.isAndroidDriver()
? androidAttributeWithValue(androidAttributeName, expectedAttributeValue)
: iosAttributeWithValue(iosAttributeName, expectedAttributeValue);
}

public static Condition androidAttributeWithValue(String androidAttributeName, String expectedAttributeValue) {
return new AttributeWithValue(androidAttributeName, expectedAttributeValue);
}

public static Condition iosAttributeWithValue(String iosAttributeName, String expectedAttributeValue) {
return new AttributeWithValue(iosAttributeName, expectedAttributeValue);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.codeborne.selenide.appium.conditions;

import com.codeborne.selenide.appium.AppiumDriverRunner;
import com.codeborne.selenide.collections.ExactTexts;
import org.openqa.selenium.WebElement;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class AppiumAttributeValues extends ExactTexts {

protected String androidAttributeName;
protected String iosAttributeName;

public AppiumAttributeValues(String androidAttributeName, String iosAttributeName, String... expectedAttributeValues) {
super(expectedAttributeValues);
this.androidAttributeName = androidAttributeName;
this.iosAttributeName = iosAttributeName;
}

public AppiumAttributeValues(String androidAttributeName, String iosAttributeName, List<String> expectedAttributeValues) {
super(expectedAttributeValues);
this.androidAttributeName = androidAttributeName;
this.iosAttributeName = iosAttributeName;
}

@Override
public boolean test(List<WebElement> elements) {

if (elements.size() != this.expectedTexts.size()) {
return false;
} else {
List<String> actualAttributeValues = getActualAttributeValuesToCompare(elements);
for (int i = 0; i < this.expectedTexts.size(); ++i) {
String expectedText = this.expectedTexts.get(i);
String actualAttributeValue = actualAttributeValues.get(i);
if (!expectedText.equals(actualAttributeValue)) {
return false;
}
}

return true;
}
}

private List<String> getActualAttributeValuesToCompare(List<WebElement> elements) {
return elements.stream().map(getFunctionBasedOnMobileOs()).collect(Collectors.toList());
}

private Function<WebElement, String> getFunctionBasedOnMobileOs() {
Map<Boolean, Function<WebElement, String>> map = new HashMap<>();
map.put(true, element -> element.getAttribute(androidAttributeName));
map.put(false, element -> element.getAttribute(iosAttributeName));
return map.get(AppiumDriverRunner.isAndroidDriver());
amuthansakthivel marked this conversation as resolved.
Show resolved Hide resolved
}
}
43 changes: 43 additions & 0 deletions src/test/java/integration/android/AndroidAppiumConditionsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package integration.android;

import com.codeborne.selenide.appium.AppiumCollectionCondition;
import com.codeborne.selenide.appium.AppiumCondition;
import com.codeborne.selenide.appium.SelenideAppium;
import io.appium.java_client.AppiumBy;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;

import java.util.Arrays;
import java.util.List;

import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.$$;
import static com.codeborne.selenide.WebDriverRunner.closeWebDriver;

class AndroidAppiumConditionsTest extends BaseApiDemosTest {

@BeforeEach
void setUp() {
closeWebDriver();
SelenideAppium.launchApp();
}

@Test
void testAppiumCollectionConditionAttribute() {
amuthansakthivel marked this conversation as resolved.
Show resolved Hide resolved

List<String> expectedList =
Arrays.asList("API Demos", "KeyEventText", "Linkify", "LogTextBox", "Marquee", "Unicode");

$(By.xpath(".//*[@text='Text']")).click();
$$(AppiumBy.xpath("//android.widget.TextView"))
.shouldHave(AppiumCollectionCondition.exactAttributes("text", "name", expectedList));
}

@Test
void testAppiumConditionAttribute() {

$(AppiumBy.accessibilityId("Accessibility"))
.shouldHave(AppiumCondition.attributeWithValue("content-desc", "name", "Accessibility"));
}
}
31 changes: 31 additions & 0 deletions src/test/java/integration/ios/IosAppiumConditionsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package integration.ios;

import com.codeborne.selenide.CollectionCondition;
import com.codeborne.selenide.appium.AppiumCollectionCondition;
import com.codeborne.selenide.appium.AppiumCondition;
import com.codeborne.selenide.appium.AppiumSelectors;
import com.codeborne.selenide.appium.SelenideAppium;
import org.junit.jupiter.api.Test;

import static com.codeborne.selenide.Selenide.$$;
import static com.codeborne.selenide.Selenide.$;

class IosAppiumConditionsTest extends BaseSwagLabsAppIosTest {

@Test
void testAppiumCollectionConditionAttribute() {
SelenideAppium.openIOSDeepLink("mydemoapprn://login");
$$(AppiumSelectors.byAttribute("type", "XCUIElementTypeTextField"))
.shouldBe(CollectionCondition.size(1))
.shouldHave(AppiumCollectionCondition
.exactAttributes("text", "name", "Username input field"));
}

@Test
void testAppiumConditionAttribute() {
SelenideAppium.openIOSDeepLink("mydemoapprn://login");
$(AppiumSelectors.byAttribute("type", "XCUIElementTypeTextField"))
.shouldHave(AppiumCondition.iosAttributeWithValue("name", "Username input field"))
.shouldHave(AppiumCondition.attributeWithValue("", "name", "Username input field"));
}
}