IOSElements包含.setValue()方法,其类型比sendKeys()快得多。但是,如果我将我的元素(使用@FindBy注释)设置为IOSElement而不是WebElement,则PageFactory将返回错误:
java.lang.IllegalArgumentException:无法将io.appium.java_client.ios.IOSElement字段screens.LoginScreen.signInEmail设置为org.openqa.selenium.remote.RemoteWebElement $$ EnhancerByCGLIB $$ 62bef779
此外,我无法将WebElements转换为IOSElements,因为它也会从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);
}
}
答案 0 :(得分:0)
看起来我的问题是我正在使用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; - 没有错误。