Java PageFactory和Appium';IOSS元素不兼容-替代解决方案?

Java PageFactory和Appium';IOSS元素不兼容-替代解决方案?,java,webdriver,appium,pageobjects,Java,Webdriver,Appium,Pageobjects,IOS元素包含.setValue()方法,该方法的键入速度比sendKeys()快得多。但是,如果我将我的元素(使用@FindBy注释)设置为IOSSelement而不是WebElement,PageFactory将返回一个错误: java.lang.IllegalArgumentException:无法将io.appium.java_client.ios.IOSElement字段screens.LoginScreen.signInEmail设置为org.openqa.selenium.remo

IOS元素包含.setValue()方法,该方法的键入速度比sendKeys()快得多。但是,如果我将我的元素(使用@FindBy注释)设置为IOSSelement而不是WebElement,PageFactory将返回一个错误:

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

此外,我不能将WebElements强制转换为IOSElements,因为这也会从JVM返回一个错误(不能强制转换)

是否有一种使用PageFactory设计初始化元素的方法?我的示例代码如下:

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);
}
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();
    }
}

}

您可以尝试使用
@iOSFindBy
注释作为
WebElement
类型的定位器。 你可以在Appium上找到一些例子。 举个例子,我在想的另一件事是尝试使用
MobileElement
而不是
WebElement

编辑: 我现在已经尝试过了,我能够使用
@iOSFindBy
注释以及
ioseelement
定位器类型。 我已经建立了一个简单的类,在我的Maven
pom.xml
中使用了以下内容:

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

注意:
MobileElement
locators类型时也会发生同样的情况,因此,如果您仍然看到任何错误,请检查您拥有的任何依赖项,因为它们很可能是导致错误的依赖项。

看起来我的问题在于我使用的是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();-没有错误。

不幸的是,使用iOSFindBy仍然给我留下了一个问题,我只能初始化WebElements。我无法将它们转换为MobileElement或IOSSelement。已使用示例代码更新了我的答案。请检查并尝试在一个全新的项目中自己尝试,以确定您的问题是来自库还是来自原始项目中的其他部分。考虑使用AppIuMuthor驱动程序代替Webdriver