Как создать объектную модель страницы, которая работает для Android и iOS в Appium Java
Я создал объект Page в Java с Appium и Selenium, который в настоящее время работает для приложения Android, как показано ниже:
public class MattVerifyPage extends PageObject{
private AppiumDriver driver = FrameworkInitialize.driver;
By verifyTitle = By.xpath("/hierarchy/android.widget.TextView");
public void verifyTitle(String expectedTitle){
String actualTitle = driver.findElement(verifyTitle).getText();
Однако мне нужно, чтобы оно работало с приложениями для Android и iOS, так как селектор xpath различен для обоих приложений. Я думаю, что мне нужно сделать что-то вроде этого:
@AndroidFindBy(xpath = “androidxpath”)
@iOSFindBy(xpath = “iOSxpath”)
public MobileElement verifyTitle ;
Это будет означать, что независимо от того, использую ли я Android или iOS, я все равно буду использовать одну переменную с именем "verifyTitle".
Однако, когда я делаю это, строка driver.findElement (String actualTitle = driver.findElement(verifyTitle).getText() показывает следующую ошибку:
findElement
(org.openqa.selenium.By)
in DefaultGenericMobileDriver cannot be applied
to
(io.appium.java_client.MobileElement)
Я думаю, что сравниваю AppiumElements с SeleniumElements, но я не уверен, как решить эту проблему.
Любая помощь будет принята с благодарностью.
Спасибо
Matt
1 ответ
Да, много смешивания типов объектов в вашем исходном примере. Вы на правильном пути с аннотациями @OSFindBy. После того, как вы определили эти элементы, у вас уже есть элемент, поэтому нет необходимости искать его снова. Следующее будет все, что вам нужно:
verifyTitle.getText()
См. Этот пост в блоге для получения дополнительной информации о объектной модели страницы (POM).
Резюме:
import all the good stuff including PageFactory;
public class YourPage {
private WebDriver driver;
public YourPage(AppiumDriver<MobileElement> driver) {
this.driver = driver;
PageFactory.initElements(new AppiumFieldDecorator(driver), this);
}
@AndroidFindBy(id = "android_button")
@iOSFindBy(id = "ios_button")
private MobileElement that_button;
public void pushTheButton() {
that_button.click()
}
}
Примечание: приведенный выше код не проверен / записан на моей голове / Я не пишу Java для жизни. Склонен к ошибкам, но должен дать вам идею.
Эта работа со мной, My Project Selenium, TestNG и Appium использует PageFactory.initElements
public class Login extends Setup {
@Test
public void loginAlert() throws InterruptedException {
Button button = new Button(driver);
PageFactory.initElements(driver, button);
Input input = new Input(driver);
PageFactory.initElements(driver, input);
Input input1 = new Input(driver);
System.out.println("Test Alert Login");
button.ById("navigation_more");
button.ById("btnLogin");
input.ById("et_email_or_phone_number", "dikakoko.com");
input1.ById("tet_password", "dikakoko");
}
}
Ниже представлена функция, которую я назвал выше.
public class Input {
AppiumDriver<MobileElement> driver;
Root root = new Root();
public Input(AppiumDriver<MobileElement> driver) {
this.driver = driver;
}
public void ById(String selector, String textValue) {
MobileElement element = driver.findElement(By.id(root.element() + ":id/" + selector));
waitForVisible(driver, element);
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.click();
actions.sendKeys(textValue);
actions.build().perform();
System.out.println("Input: " + textValue);
}
private void waitForVisible(AppiumDriver<MobileElement> driver, MobileElement element) {
try {
Thread.sleep(5000);
System.out.println("Waiting for element visibility");
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOf(element));
} catch (Exception e) {
e.printStackTrace();
}
}
}
и это
public class Button {
AppiumDriver<MobileElement> driver;
Root root = new Root();
public Button(AppiumDriver<MobileElement> driver) {
this.driver = driver;
}
public void ById(String selector) {
MobileElement element = driver.findElement(By.id(root.element() + ":id/" + selector));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.click();
actions.build().perform();
System.out.println("Button is Clicked!");
}
}
Я использую это
Button button = new Button(driver);
PageFactory.initElements(driver, button);
Input input = new Input(driver);
PageFactory.initElements(driver, input);
Мои рекомендации: с сайта www.seleniumeasy.com