【问题标题】:GEB not finding elementsGEB 未找到元素
【发布时间】:2018-12-17 06:31:30
【问题描述】:

我对 GEB 很陌生,我正在尝试使用 spock 和 selenium 创建一个非常简单的测试用例。

该应用程序是使用 OJET 的单页应用程序

HTML 代码

<div class="oj-hybrid-padding">
    <div id="dashboardTitleDiv">
        <h1>Dashboard Content Area</h1>
    </div>
    .....
</div>

GEB 页面

class ISSDashboardPage extends Page {
    static url = "?root=dashboard"
    static at = { $("div#dashboardTitleDiv>h1").text() == "Dashboard Content Area" }
}

Groovy 测试

class NavigateToWorkspaceSpec extends GebSpec {
    def "can navigate to Workspace"() {
        when: to ISSDashboardPage
        then: waitFor(25){at ISSDashboardPage}
    }
}

由于某种我不明白的原因,页面“at”上的选择器不起作用。这是我得到的错误:

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 10.763 sec <<< FAILURE! - in NavigateToWorkspaceSpec
can navigate to Workspace(NavigateToWorkspaceSpec)  Time elapsed: 10.39 sec  <<< FAILURE!
org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
$("div#dashboardTitleDiv>h1").text() == "Dashboard Content Area"
|                             |      |
[]                            null   false
        at NavigateToWorkspaceSpec.can navigate to Workspace(NavigateToWorkspaceSpec.groovy:8)


Results :

Failed tests:
  NavigateToWorkspaceSpec.can navigate to Workspace:8->GebSpec.methodMissing:56 $("div#dashboardTitleDiv>h1").text() == "Dashboard Content Area"
|                             |      |
[]                            null   false

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

如果选择器只是 "$(h1).text() 它会找到第一个 "h1" 元素的文本

$("h1").text() == "Dashboard Content Area"
|       |      |
|       |      false
|       Inside Sales

谁能发现哪里出了问题? 我注意到页面的部分部分尚未呈现(实际上我还看不到我期望看到的)。但我希望测试中的 waitFor 至少要等待 25 秒才能解决该选择器。

非常感谢。

最好的问候

【问题讨论】:

    标签: jquery selenium spock geb


    【解决方案1】:

    确定

    • at 检查器没有被缓存,
    • 元素是可选的并且
    • 只需将等待权集成到页面元素中,以避免测试中出现waitFor。 (但是,嘿,25 秒真的很长。你的页面真的这么慢吗?)
    static at = { dynamicH1.text() == "Dashboard Content Area" }
    
    static content = {
      dynamicH1(required: false, wait: 25, cache: false) { $("div#dashboardTitleDiv>h1") }
    }
    

    【讨论】:

    • 非常感谢 kriegaex。它运行良好,没有任何抱怨。实际上,如果我只是在 dynamicH1 的定义上添加等待就足够了。这个值太高了,因为我只是想确保页面有足够的时间加载。现在我可以减少它。非常感谢
    • @kriegaex 你能解释一下为什么需要这个元素:false?如果页面还没有完全加载,我们为什么要让测试继续进行?
    • 就像上面所说的OP,在这种情况下你并不需要它。在我的本地测试用例中,我模拟了一个更复杂的at 检查器,例如foo() || bar() || zot(),即页面的三个动态部分中的任何一个首先可用,at 检查器将返回 true 并停止阻止测试。根据某些配置(例如用户权限),页面的某些部分根本不可用。如果没有required: false,测试会因为元素不可用而产生异常。抱歉,我没有复制完整的页面并在这里测试,我只是在扩展我自己的旧测试用例。
    • 我试图了解他的 at 块中的唯一检查是否是 dynamicH1,然后我们将其标记为 req:false,即使页面尚未加载,测试也可以继续通过此检查,导致失败行号?
    • 试一试,我看不到你的代码。但基本上对于required: true(默认),您的at 签入测试将产生WaitTimeoutException: condition did not pass in 25.0 seconds,对于required: false,它只会为页面返回null,产生Condition not satisfied: at DateFormatTimeZonePage | null。所以即使这样,测试也会在这里失败,只有一个不那么混乱的错误消息。做任何适合你情况的事情,但正如我所说:自己尝试,不要只是在这里和我理论。 :-)
    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多