Selenium WebDriver-在每个测试步骤之前显式等待

Selenium WebDriver-在每个测试步骤之前显式等待,selenium,cucumber,Selenium,Cucumber,我倾向于避免我将要对其执行操作的元素不可见或不可单击的情况 结果是我使用了很多显式等待,实际上是在每个测试步骤之前。请参阅下面提供的示例 @When("^User goes into Best Sellers in Digital Cameras$") public void userGoesIntoBestSellersInDigitalCameras() { wait.until(ExpectedConditions.elementToBeClickable(mainPage.get

我倾向于避免我将要对其执行操作的元素不可见或不可单击的情况

结果是我使用了很多显式等待,实际上是在每个测试步骤之前。请参阅下面提供的示例

@When("^User goes into Best Sellers in Digital Cameras$")
public void userGoesIntoBestSellersInDigitalCameras() {
    wait.until(ExpectedConditions.elementToBeClickable(mainPage.getDepartmentsButton()));
    mainPage.clickDepartmentsButton();
    wait.until(ExpectedConditions.elementToBeClickable(departments.getCameraPhotoVideoLink()));
    departments.clickCameraPhotoVideoLink();
    wait.until(ExpectedConditions.elementToBeClickable(cameraPhotoVideo.getBestSellersLink()));
    cameraPhotoVideo.clickBestSellersLink();
    wait.until(ExpectedConditions.elementToBeClickable(bestSellersBestCameraPhoto.getDigitalCamerasLink()));
    bestSellersBestCameraPhoto.clickDigitalCamerasLink();
    wait.until(ExpectedConditions.titleIs(bestSellersBestDigitalCameras.getExpectedBestSellersBestDigitalCamerasPageTitle()));
}
您能告诉我这是一个好的做法还是显式等待的数量不应该太多?谢谢

TL;DR:每个页面对象都可以封装自己的逻辑,以便单击给定元素(并在实际单击之前等待给定元素)

我看到您已经使用页面对象模式(model)分离了页面对象,您只需要进一步,而不是让页面对象中的每个click方法都只是“click”,让它调用一个helper方法,该方法首先检查元素是否可见、启用和可单击。这样,您只需要编写一个方法来处理这个问题,您就可以对它进行微调,使其能够很好地处理各种情况,页面对象只需要将web元素作为参数传递


如果您以这种方式对所有页面对象方法进行编码,您根本不需要在测试用例代码中担心它,您知道该方法将始终等待项目可点击,并且它大大简化了测试用例(步骤)代码和页面对象代码。

请查看提供的代码,并告知我是否正确理解了您的意思?是的,这就是我所说的要点。谢谢!我还有一个问题:我应该在每个页面类中创建'isClickable'和'clickElement'方法吗?是否有某种方法可以处理这种“全局”的情况,并且仍然不会与页面对象模式(模型)规则发生冲突?是的。事实上,我有一个单独的帮助文件,其中所有方法都以“pom”开头,即pomxists、pomClick、pomSendKeys、pomGetText等,并将该包包含在页面对象基类中,以便Selenium函数都用try/catch、wait等包装。因此,我的页面对象可能具有调用pomClick(userID)的方法userIDClick等待和其他常见逻辑在我单击任何元素时执行。