使用Robot Framework减慢测试运行的好方法?

时间:2015-08-27 15:23:19

标签: python selenium robotframework

所以我对Robot Framework有了新的认识,现在已经多次遇到过这个问题的各种形式。基本上我创建了一套测试,最终通过并检查我期望的东西,然后他们通过CI / CD管道和专用测试运行器我遇到了一些失败。从本质上讲,这似乎是因为测试跑步者做得更快一些,无论是由于硬件还是硒的速度,都没关系。

为了避免这些失败,我最终添加到测试中以在某些点“减慢”它们以确保成功,基本上使它们膨胀或者只是保护它们。那么对于那些有更多经验的人,你如何处理这种情况?我想尽可能坚持最佳实践,即我不只是在任何地方使用睡眠,而是使用隐式等待,但我仍然不知道最好的方法是什么。

以下是我最近遇到的一个问题的片段:

Wait Until Page Contains Element ${STATIC_TABLE_XPATH}/somepath 10
${image_text} = Selenium2Library.Get Element Attribute ${STATIC_TABLE_XPATH}/somepath
${second_paragraph_text} = Selenium2Library.Get Text ${STATIC_TABLE_XPATH}/somepath

所以基本上尽管这些在功能上是正确的,但是当他们在测试跑步者上跑时,他们有时会撤回任何东西。我认为这是因为事情发生得太快,所以我添加了Wait Until Page Contains Element,遗憾的是同样的问题仍然存在。有没有最好的方法来处理这种情况,所以它一直通过?

我想添加一个等待,直到关键字在预期的变量值上成功将是非常可怕但很高兴被证明是错误的!

3 个答案:

答案 0 :(得分:2)

drkthng的推理是正确的,但您不需要编写所有代码......它已经存在于WWDC 2015 session 220中。一个简单的例子

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(locator));

查看所有可用方法的文档(有一堆)以及如何使用它们。

答案 1 :(得分:1)

即使你觉得它很可怕,我认为减慢Selenium的最佳方法是保持轮询元素属性,直到你得到一个合适的变量。在成功之前尝试某事是没有害处的。如果您有错误,属性值永远不会正常。我相信 Wait Until Keyword Succeeds 关键字只针对这样的情况。我一直都在使用它。

答案 2 :(得分:0)

尽可能避免睡眠。

隐式等待也不是可扩展的解决方案。如果你正在检查“不存在”,它们可以帮助你恢复正常生活。例如,元素。

我建议您充分利用WebDriverWaits。

我经常要等待某些元素或页面显示,所以我写了一些像这样的方法:

public void waitUntilDisplayed(By elementLocator, int timeoutInSeconds) {
    WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver, timeoutInSeconds).ignoring(StaleElementReferenceException.class);
    wait.until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {

            return elementIsDisplayed(elementLocator);
        }
    });
}

public boolean elementIsDisplayed(By elementLocator) {
    if(elementExists(elementLocator)) {
        WebElement element = driver.findElement(elementLocator);
        return element.isDisplayed();
    }
    return false;
}

public boolean elementExists(By elementLocator) {
    List<WebElement> elements = driver.findElements(elementLocator);
    if (elements.size() < 1) {
        return false;
    }

    return true;
}