当前位置: 首页 > 知识库问答 >
问题:

如何在Appium中创建适用于Android和iOS的页面对象模型Java

充星腾
2023-03-14

我已经使用Appium和Selenium在Java中创建了一个页面对象,该对象目前正在为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我仍然会使用一个叫做“验证标题”的变量。

然而,当我这样做的时候,司机。findElement行(字符串actualTitle=driver.findElement(verifyTitle))。getText()显示以下错误:

findElement
(org.openqa.selenium.By)
in DefaultGenericMobileDriver cannot be applied
to
(io.appium.java_client.MobileElement)

我想我正在比较应用程序和硒元素,但我不确定如何解决它。

任何帮助将不胜感激。

谢谢

马特

共有2个答案

富辰阳
2023-03-14

与我一起工作,我的项目Selenium、TestNG和Appium使用PageFactory。初始元素

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。通用域名格式

巫马庆
2023-03-14

是的,在您的原始示例中,大量混合了对象类型。您使用@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为生的。容易出错,但应该给你一个想法。

 类似资料:
  • 是否有任何Gem(比如siteprism:用于Web自动化测试)可以在我的移动自动化测试项目中使用,以使用页面对象模型模式定义屏幕。 提前谢谢

  • 这可能是一个非常奇怪的问题,但我甚至不知道如何命名这个问题。我对C#和Selenium很陌生。我已经对它做了一些编码,我很乐意创建一个(quitemessy)测试,它可以按照我想要的方式运行。我想把我的考试安排得更好一点。 我将用这个例子来说明我想要实现的目标: 在登录页面上,我们可以说我有一个“登录”按钮,该按钮打开一个页面,让我输入我的凭证“用户名”和“密码”。 让我们说我想这样编程:有登录的

  • 我有一个测试自动化工具,现在我们正在为我们的网络应用程序的自动化测试实现页面对象模型,根据我的理解,如果你只有一个应用程序要测试,页面对象模型是好的,但是我们有多个网络应用程序要测试测试。我只是想知道是否真的有可能为多个Web应用程序创建页面对象模型,并且该工具应该能够通过使用页面对象进行自动化测试??

  • 我在iPhone(模拟器)上自动化一个应用程序,我需要在应用程序启动后滑动页面(在最开始的飞溅页面)使用滑动功能不起作用: 尝试了其他选项,例如执行一个来实现同样的功能,但也没有成功。并尝试了更多的在线解决方案。在我的情况下,没有一个起作用。我在某个地方读到,版本7及以上不支持刷卡。这是真的吗?或者有解决办法吗? 我有最新版本的Xcode,Appium Xcode:7.3 Appium:1.4.1

  • 我的网页上有一个按钮,一旦输入所需的信息,我想点击它。我目前正在使用By来建立页面的所有元素,但想使用WebElements作为这个按钮,然后使用Actions稍后单击它。我应该如何在我的页面对象类中做到这一点。 我尝试了以下方法: 但在以TestNG的形式运行测试类时,它在WebElement行上显示空指针异常。也尝试使用By执行此操作,但按钮无法收到单击。它与WebElements配合得非常好

  • 希望我不是第一个遇到这个问题的人。 问题是我还需要检查该元素在页面上是否可见,并且在执行checked之前它会出错(例如,使用WebDriverWait,将ExpectedConditions.ElementisVisible(by)传递给.Until方法)。 我如何将IWebElement和By locator清晰地分开,并允许在需要的地方进行这种明确的等待/检查? TLDR-如何维护页面对象模