PageFactory 和 Appium 的 IOSElements 不兼容 - 替代解决方案?

PageFactory and Appium's IOSElements are not compatible - alternative solution?

IOSElements 包含 .setValue() 方法,其类型比 sendKeys() 快得多。但是,如果我将我的元素(使用 @FindBy 注释)设置为 IOSElement 而不是 WebElement,PageFactory 将 return 一个错误:

java.lang.IllegalArgumentException:无法将 io.appium.java_client.ios.IOSElement 字段 screens.LoginScreen.signInEmail 设置为 org.openqa.selenium.remote.RemoteWebElement$$EnhancerByCGLIB$$62bef779

此外,我无法将 WebElements 转换为 IOSElements,因为这也会 return 来自 JVM 的错误(无法转换)。

有没有办法使用 PageFactory 设计来初始化 IOSElements?我的示例代码如下:

public class LoginScreen {

private WebDriver driver;

@FindBy(className = "UIATextField")
public IOSElement signInEmail;

@FindBy(className = "UIASecureTextField")
public IOSElement signInPassword;

@FindBy(id = "Log in")
public IOSElement loginButton;

@FindBy(id = "Forgot your password?")
public IOSElement forgotPasswordButton;

public LoginScreen(WebDriver driver) {
    this.driver = driver;
    PageFactory.initElements(new AppiumFieldDecorator(driver), this);
}

public SomeOtherObject login(String email, String password) {
    signInEmail.setValue(email);
    signInPassword.setValue(password);
    loginButton.click();
    return new SomeOtherObject(driver);
}

}

您可以尝试对 WebElement 类型的定位器使用 @iOSFindBy 注释。 你可以在 Appium github page 上找到一些例子。

我正在为您考虑的另一件事是尝试转换为 MobileElement 而不是 WebElement

编辑:

我现在已经试过了,我可以使用 @iOSFindBy 注释和 IOSElement 定位符类型。 我设置了一个简单的 class,在我的 Maven pom.xml 中使用以下内容:

<dependency>
    <groupId>io.appium</groupId>
    <artifactId>java-client</artifactId>
    <version>2.1.0</version>
</dependency>

然后,测试class,如下:

import io.appium.java_client.ios.IOSElement;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import io.appium.java_client.pagefactory.iOSFindBy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;

public class ATestClass {
    private WebDriver driver;

    @iOSFindBy(className = "classname")
    public IOSElement testing;

    public ATestClass(WebDriver driver)
    {
        this.driver = driver;
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }

    public void ATestMethod()
    {
        testing.click();
    }
}

注意:当 MobileElement 定位符键入时,情况相同,因此如果您仍然看到任何错误,请检查您拥有的任何依赖项,因为很可能是那些导致错误的依赖项。

看来我的问题是我使用的是 WebDriver 的远程实例,如下所示:

this.driver = new WebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

但是,我可以获得具有相同设置的 IOSDriver 实例:

this.driver = new IOSDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

传递给 PageFactory.initElements() 时接受 IOSElements; - 没有错误。