【问题标题】:Good ways to slow down a test run using Robot Framework?使用 Robot Framework 减慢测试运行的好方法?
【发布时间】:2015-11-22 01:48:36
【问题描述】:

所以我对 Robot Framework 相当陌生,现在已经多次遇到这个问题的各种形式。本质上,我创建了一套测试,这些测试最终通过并检查了我期望的东西,然后它们通过 CI/CD 管道,在专用的测试运行器上我遇到了一些失败。从本质上讲,这似乎是因为测试运行器做的事情要快一点,无论是由于硬件还是 selenium 速度,这并不重要。

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

这是我最近遇到的一个问题的 sn-p:

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 关键字调用的超时时间?
  • 我认为这不会有帮助吗?它几乎立即通过了那个阶段,所以不会产生影响?我发现整个情况很奇怪,因为我得到的东西不受 Javascript 的影响,它从页面加载时就存在,但是因为页面上有活动,它必须搞砸

标签: python selenium robotframework


【解决方案1】:

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

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

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

【讨论】:

  • 我还是希望用关键字来实现这一点,而不是直接的 Selenium 实现。如果是这种情况,您有什么进一步的建议吗?
  • 我不确定您所说的关键字是什么意思...您能举个例子吗?
  • 如前所述,我正在使用 Robot Framework 来解决这个问题(这是业务使用的。)我可以添加库来处理更复杂的情况,但由于这相当简单,我想通过 pre 来练习 Robot - 如果可能的话,现有的关键字。对于我的情况,我认为有一个我不知道的“最佳实践”
  • 嗯,好的。抱歉,我不熟悉机器人框架,所以我试图从 Selenium 方面提供帮助。
  • 不用担心 JeffC,感谢您的回答并试图帮助我解决问题。看到纯 Selenium 方面很有趣,老实说,我宁愿在 Selenium 中做这件事,你的解决方案非常整洁。
【解决方案2】:

即使你觉得这很可怕,我认为减慢 Selenium 速度的最好方法是保持轮询元素属性,直到你得到一个合适的变量。在成功之前尝试做某事并没有什么坏处。如果您有错误,则属性值将永远不会正常。我相信 Wait until Keyword Succeeds 关键字只是针对这种情况而设计的。我一直在使用它。

【讨论】:

  • 感谢 Pekka,这是我最初解决问题的方法,但认为那些更熟悉 Robot Framework 的人可能会使用一些“更好”的东西。如果这是处理这种情况的最佳方式,那么我很乐意这样做。
  • 更进一步,您将如何使用“等待关键字成功”来解决此问题?显然Get Text无论返回空还是非空都会成功?
  • 使用 element_id 和 expected_text 参数创建您自己的关键字。然后与获取文本输出进行比较并成功或失败
【解决方案3】:

尽可能避免睡眠。

隐式等待也不是可扩展的解决方案。例如,如果您正在检查元素的“不存在”,它们可能会让您望而却步。

我建议你充分利用 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;
}

【讨论】:

  • 所以这将涉及编写我自己的库或扩展现有的库?如果绝对必要,我只想走那条路。无论如何,我没有使用隐式等待来检查不存在。我认为对于这种情况,必须有一种“理想”的方法来使用关键字。在检查值的相等性后等到关键字成功似乎是当前的领先者,但似乎不是一个太干净的解决方案
猜你喜欢
  • 2015-01-31
  • 2018-01-11
  • 2016-12-24
  • 2017-09-21
  • 2023-03-17
  • 2014-02-27
  • 2014-09-20
  • 2019-09-03
  • 2014-09-28
相关资源
最近更新 更多