元素在点上不可点击 - 但实际上它点击了

Element is not clickable at point - but it clicks in fact

我的测试失败了:

WebDriverException: Message: unknown error: Element is not clickable at point (1 786, 183). Other element would receive the click: <'div align="right">...<'/div>

我访问的xpath是:

${UPDATE}    xpath=//button[@type='submit' and contains(text(),'Update')]

在关键字中使用:

    wait until element is visible   ${UPDATE}
    click element    ${UPDATE}

来源:

<div align="right">
    <button type="submit" class="btn btn-primary ng-binding" ng-click="submitForm()" ng-disabled="updateDisabled">Update</button>
    <button type="button" class="btn btn-primary" ng-click="reset(projectForm)" ng-disabled="updateDisabled">Reset</button>
</div>

但是按钮在测试中确实被点击了 -> 数据被保存了-所以没问题。 我只是不明白为什么它在正确点击时会抛出异常,我该怎么做才能让它通过……很明显它找到了元素并点击了它……我也尝试使用 "wait until element is enabled" 和 "focus"...感谢您的任何建议! PS:我在div元素中异常添加了字符“'”,否则这里不显示..:)

虽然这样做确实是一种不好的做法,但我建议在您的测试用例周围放置几个 Sleep 1s 关键字,例如:

Sleep    1s
Wait Until Element Is Visible   ${UPDATE}
Sleep    1s
Click Element    ${UPDATE}
Sleep    1s

只是为了调试并确保驱动程序没有被自身绊倒。 (这是我遇到的问题) 如果这随后起作用并通过,那么您基本上需要等待比激活按钮更长的时间。网页的另一部分是否需要更长的加载时间?如果是这样使用那个。

但是,如果可以的话,请摆脱 Sleep 1s 关键词,因为这确实是一种糟糕的做法。

我正在使用以下方法。

  1. 找到一个在页面完全加载后可见的元素。
  2. 得到它的 xpath

使用以下关键字:

Wait Until Keyword Succeeds  Page Should Contain Element  ${Xpath}
Click Element  ${Element}

这将帮助您避免在测试用例中使用 sleeps

怎么样: wait until element is visible ${UPDATE} mouse down ${UPDATE} mouse up ${UPDATE}

为我工作了一些奇怪的表演元素..

在某些情况下,Wait Until Element Is EnabledWait Until Element Is Visible 会 return 为真,但该元素仍然不可点击,因为它是 hidden/overlapped 另一个元素。

我可以在我的应用程序中重现这种情况。我得到的错误是:

ElementClickInterceptedException:
Message: element click intercepted:
Element <button>...</button> is not clickable at point (169, 286). Other element would receive the click: <div></div>

如果不编写外部库,似乎没有任何 "smart" 解决方案。目前,最好的方法是使用这个:

*** Keywords ***
Click Element Wait
    [Arguments]    ${locator}=required    ${timeout}=2    ${mustWait}=False
    Wait Until Element Is Visible    ${locator}    ${timeout}
    Wait Until Element Is Enabled    ${locator}    ${timeout}
    Run Keyword If    $mustWait == True    Sleep    1s
    Click Element    ${locator}

这样使用:

Click Element Wait    myButton    4    True    # Wait until element is visible & enabled, then another 1 second as well
Click Element Wait    myButton    # Just wait until element is visible & enabled

理查德的回答很有帮助,但可能并不直接适用于所有人。我必须根据我的用例对其进行自定义 -

Wait Until Keyword Succeeds      5x     10s      Click Element   XPATH://<add xpath>

这将 运行 测试 5 次,两次失败之间的间隔为 10 秒,绝对消除了在代码中进行任何显式休眠的需要。这两个值都可以更改以更好地满足您的需求。请注意,Wait Until Keyword Succeeds 关键字可以与包括 Input Text 在内的任何操作一起使用,这意味着如果您更改测试用例的每一行以使用它,您可以保证您的测试将通过,而不管网站的响应时间。