Как создать объектную модель страницы, которая работает для 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

Другие вопросы по тегам