Selenium - 每个页面都有一个 'next' 按钮,但同一个按钮并不总是指向同一个页面
Selenium - Every page has a 'next' button but the same button doesn't always lead to the same page
我正在办公室做一些 selenium 工作,最近对我正在自动化的页面进行了一些更改,我正试图找出最好的方法来做这件事。我不确定如何解释所有内容,但我会尝试一下。
我有一个不同 'steps' 的付款表格。每个步骤都会要求您填写一些信息,它们都有一个 'continue' 按钮可以转到下一步。由于每个 pageObject 共享相同的按钮,我用该逻辑创建了一个抽象 class 并使所有页面都从该页面扩展。
像这样(删除所有与问题无关的代码):
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();
}
而子 classes 是这样定义的:
public class PersonalInfoPage extends AbstractPaymentPage<PaymentCountryPage> {
public PersonalInfoPage(WebDriver driver) {
super(driver);
}
@Override
protected Class<PaymentCountryPage> getNextStepClass() {
return PaymentCountryPage.class;
}
}
这个的典型用法是调用 PersonalInfoPage.nextStep()
,它将单击继续按钮并初始化下一页上的所有 webElements。
现在,这行得通,而且我对此非常满意,但只有当当前页面可以准确地告诉下一个页面时,它才会起作用。在这种情况下 'PersonalInfoPage' 知道下一个是 'PaymentCountryPage'。但是随着这些新的变化,有些情况下流程将是 PageA->PageB->PageC->PageD,其他情况可能是 PageA->PageD,而其他情况可能是 PageA->PageC->PageD。
你们认为在不以大量代码重复结束的情况下处理此类问题的最佳方法是什么?我在想,也许我可以使用通用变量而不是 'getNextStepClass' 的实际目的地 class,但我不确定它是如何工作的。
不知道是否足够清楚以获得一些帮助,但请随时提出任何你们认为需要更多解释的问题等等。
可以通过将一些自加载逻辑引入 PageObjectModel 来处理这种复杂的情况。此外,一些 IoC with the LoadableComponent and the SlowLoadableComponent 在这里可以提供很大的帮助。简而言之 - 让最后一页知道如何通过调用前一页(如果适用于您的域)来加载自己。
而不是
PageA->PageB->PageC->PageD
你会得到类似
的东西
PageD-load->PageC-load->PageB-load->PageA
这里的明显优势将是避免
时可重用的接收控制流
ending with a ton of code duplication
我正在办公室做一些 selenium 工作,最近对我正在自动化的页面进行了一些更改,我正试图找出最好的方法来做这件事。我不确定如何解释所有内容,但我会尝试一下。
我有一个不同 'steps' 的付款表格。每个步骤都会要求您填写一些信息,它们都有一个 'continue' 按钮可以转到下一步。由于每个 pageObject 共享相同的按钮,我用该逻辑创建了一个抽象 class 并使所有页面都从该页面扩展。
像这样(删除所有与问题无关的代码):
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();
}
而子 classes 是这样定义的:
public class PersonalInfoPage extends AbstractPaymentPage<PaymentCountryPage> {
public PersonalInfoPage(WebDriver driver) {
super(driver);
}
@Override
protected Class<PaymentCountryPage> getNextStepClass() {
return PaymentCountryPage.class;
}
}
这个的典型用法是调用 PersonalInfoPage.nextStep()
,它将单击继续按钮并初始化下一页上的所有 webElements。
现在,这行得通,而且我对此非常满意,但只有当当前页面可以准确地告诉下一个页面时,它才会起作用。在这种情况下 'PersonalInfoPage' 知道下一个是 'PaymentCountryPage'。但是随着这些新的变化,有些情况下流程将是 PageA->PageB->PageC->PageD,其他情况可能是 PageA->PageD,而其他情况可能是 PageA->PageC->PageD。
你们认为在不以大量代码重复结束的情况下处理此类问题的最佳方法是什么?我在想,也许我可以使用通用变量而不是 'getNextStepClass' 的实际目的地 class,但我不确定它是如何工作的。
不知道是否足够清楚以获得一些帮助,但请随时提出任何你们认为需要更多解释的问题等等。
可以通过将一些自加载逻辑引入 PageObjectModel 来处理这种复杂的情况。此外,一些 IoC with the LoadableComponent and the SlowLoadableComponent 在这里可以提供很大的帮助。简而言之 - 让最后一页知道如何通过调用前一页(如果适用于您的域)来加载自己。
而不是
PageA->PageB->PageC->PageD
你会得到类似
的东西PageD-load->PageC-load->PageB-load->PageA
这里的明显优势将是避免
时可重用的接收控制流ending with a ton of code duplication