因此,我继承了一个自动化项目(基于JAVA11,使用Selenium/TestNG),他们希望将它重新分解为代码库使用Fluent设计,这样,非编码人员就可以更容易地启动测试构建。使得Sense...however...they在其Page中使用嵌套的JAVA类,并且仍然希望保持这种状态。
我对C#很在行,但不太熟悉JAVA和嵌套类。下面是我所说的例子。他们基本上想要Fluent设计,所以如果他们需要访问嵌套类,他们可以在父类的using事件中调用它,这样它不会影响链。
我已经查找过Selenium的例子,但是很难找到一些。如能提供任何协助,我们将不胜感激。
\\Code Base
public class UserAdminPage
{
@SuppressWarnings("unused")
private static WebElement element = null;
public UserAdminPage(RemoteWebDriver driver)
{
PageFactory.initElements(driver, this);
}
public static UserAdminPage using(RemoteWebDriver driver)
{
return new UserAdminPage(driver);
}
public static class AddEditUserInformation
{
@FindBy(name = "firstName")
public WebElement FirstName_txtbx;
public UserAdminPage FirstName_txtbx(String firstname)
{
this.FirstName_txtbx.sendKeys(firstname);
return this;
}
@FindBy(name = "lastName")
public WebElement LastName_txtbx;
public AddEditUserInformation LastName_txtbx(String lastname)
{
this.LastName_txtbx.sendKeys(lastname);
return this;
}
}
@FindBy(id = "AccountsList")
public WebElement AccountName_dropdwn;
public void AccountName_dropdwn()
{
this.AccountName_dropdwn.click();
}
@FindBy(id = "Save_button")
public WebElement Save_btn;
public void Save_btn()
{
this.Save_btn.click();
}
}
\\Test Event
UserAdminPage.using(driver).AccountName_dropdwn()
.AddEditUserInformation.FirstName_txtbx("John")
.AddEditUserInformation.LastName_txtbx("Doe")
.Save_btn()发布于 2019-11-09 00:11:57
正如Zag在他的回答中指出的,您所说的“嵌套类”实际上是“常规类”(因为它们是静态的),这里唯一不寻常的地方是它们与其他类放在同一个文件中。
除非您愿意做出一些牺牲,否则您不可能有一个很好的“流畅设计”,类没有任何共同点(没有公共接口,也没有泛型的使用)。下面的代码显示了使用"on“方法的折衷:有一个链,但是您需要手动地将链从一个类移动到另一个类(这通常是一个好的”流畅设计“会为您隐藏并自动完成的事情,因此您不必考虑它)。
请注意,下面的代码编译并可以执行(通过"main“方法)--如果可能的话,这就是您的代码应该在您的问题中显示的方式。
package so;
public class UserAdminPage {
public static void main(String[] args) {
// test code
System.out.println("Start test.");
UserAdminPage.using(new RemoteWebDriver())
.AccountName_dropdwn()
.onAddEditUserInformation()
.FirstName_txtbx("John")
.LastName_txtbx("Doe")
.onUserAdminPage()
.Save_btn();
System.out.println("Finished test.");
}
public static UserAdminPage using(RemoteWebDriver driver) {
return new UserAdminPage(driver);
}
private WebElement AccountName_dropdown = new WebElement();
private WebElement Save_btn = new WebElement();
public UserAdminPage(RemoteWebDriver driver) {
PageFactory.initElements(driver, this);
}
public UserAdminPage AccountName_dropdwn() {
AccountName_dropdown.click();
return this;
}
public UserAdminPage Save_btn() {
Save_btn.click();
return this;
}
public AddEditUserInformation onAddEditUserInformation() {
return new AddEditUserInformation(this);
}
// nested class
public static class AddEditUserInformation {
private UserAdminPage page;
public WebElement FirstName_txtbx = new WebElement();
public WebElement LastName_txtbx = new WebElement();
public AddEditUserInformation(UserAdminPage page) {
this.page = page;
}
public AddEditUserInformation FirstName_txtbx(String firstname) {
this.FirstName_txtbx.sendKeys(firstname);
return this;
}
public AddEditUserInformation LastName_txtbx(String lastname) {
this.LastName_txtbx.sendKeys(lastname);
return this;
}
public UserAdminPage onUserAdminPage() {
return page;
}
}
// external classes
public static class WebElement {
public void sendKeys(String keys) {}
public void click() {}
}
public static class RemoteWebDriver {}
public static class PageFactory {
public static void initElements(RemoteWebDriver driver, UserAdminPage page) {}
}
}发布于 2019-11-08 21:18:57
静态的公共内部类本质上是一个完全独立的类,可以轻松地放在另一个文件中。
您正在调用AccountName_dropdwn,然后尝试对其返回值调用一个方法,这是无效的。您要调用的方法是AddEditUserInformation.FirstName_txtbx,但这是AddEditUserInformation的一个(非静态)成员函数,因此只能在该类的一个实例上调用它。代码中的任何地方都不会创建一个。
如果方法AccountName_dropdwn返回一个AddEditUserInformation对象,我认为您的代码可能会正常工作。我假设方法名称的不必要的限定不会阻止它的工作,但它是如此的不寻常,我不确定。
https://stackoverflow.com/questions/58773286
复制相似问题