我在办公室做了一些硒工作,最近对我自动化的页面进行了一些更改,我试图找出最好的方法。我不确定如何解释一切,但我会尝试一下。
我有一个付款表格,其中包含不同的步骤'。每一步都要求您填写一些信息,并且他们都会继续'继续'按钮转到下一步。由于每个pageObject共享相同的按钮,因此我使用该逻辑创建了一个抽象类,并使该页面的页面扩展。
这样的事情(删除所有与问题无关的代码):
public abstract class AbstractPaymentPage<T extends AbstractPaymentPage> extends AbstractPageObject {
@FindBy(id = "continueBtn")
private WebElement continueButton;
public AbstractPaymentPage(WebDriver driver) {
super(driver);
}
public T nextStep() {
continueButton.click();
return this.initPageObject(getNextStepClass());
}
protected abstract Class<T> getNextStepClass();
}
子类的定义如下:
public class PersonalInfoPage extends AbstractPaymentPage<PaymentCountryPage> {
public PersonalInfoPage(WebDriver driver) {
super(driver);
}
@Override
protected Class<PaymentCountryPage> getNextStepClass() {
return PaymentCountryPage.class;
}
}
这种情况的典型用法是调用PersonalInfoPage.nextStep()
,它将点击“继续”按钮并初始化下一页上的所有webElements。
现在,这很有效,我实际上很满意它,但它只有在当前页面可以确切地确定下一个页面出现时才有效。在这种情况下,&#39; PersonalInfoPage&#39;知道下一个是&#39; PaymentCountryPage&#39;。但是,在这些新的变化的情况下,流程将是PageA-&gt; PageB-&gt; PageD,其他可以是PageA-&gt; PageD和其他可以是PageA-&gt; PageC-&gt; PageD 。
你们认为最好处理这样的事情而没有大量的代码重复?想到也许我可以使用通用变量而不是实际的目标类来获得&#39; getNextStepClass&#39;但我不确定这是怎么回事。
Dunno如果它足够清楚以获得一些帮助,但随时可以问你们认为需要更多解释的所有内容。
答案 0 :(得分:1)
可以通过在PageObjectModel中引入一些自加载逻辑来处理这种复杂场景。更多IoC LoadableComponent和SlowLoadableComponent可以在这里提供很大的帮助。简而言之 - 让最后一页知道如何通过调用上一页(如果适用于您的域)加载自身。
而不是
PageA-&GT; PageB-&GT; PageC-&GT;寻呼
你会得到像
这样的东西PageD-load->PageC-load->PageB-load->PageA
这里明显的优势将是可避免的接收控制流程,以避免
以大量代码重复结束