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; - 没有错误。
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; - 没有错误。