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

时间:2016-12-08 17:54:29

标签: selenium xpath automated-tests robotframework selenium2library

我的测试失败了:

  

WebDriverException:消息:未知错误:元素在点(1处)不可单击   786,183)。其他元素将收到点击:<'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>

按钮确实在测试中点击了 - &gt;数据被保存 - 所以没关系。 我只是不明白为什么它在正确点击时抛出异常,我该怎么办才能让它通过..很明显,它找到了元素并点击了它...我也试着用“等到元素启用“和”焦点“...感谢任何建议! PS:我在异常中为div元素添加了字符“'”,否则这里没有显示.. :))

5 个答案:

答案 0 :(得分:0)

虽然这样做非常糟糕,但我建议在测试用例周围添加几个Sleep 1s个关键字,例如:

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

只是为了调试并确保驱动程序不会绊倒自己。 (这是我遇到的问题) 如果这样可以工作并通过,那么您将需要基本等待比处于活动状态的按钮更长的时间。网页的另一部分需要更长时间才能加载吗?如果是这样的话。

但是当你可以的时候,摆脱Sleep 1s关键词,因为这是非常糟糕的做法。

答案 1 :(得分:0)

我使用以下方法。

  1. 找到页面完全加载后可见的元素。
  2. 得到它的xpath
  3. 使用以下关键字:

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

    这有助于您避免在测试用例中使用sleeps

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在某些情况下,java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: ****************************************************************************** * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers * * should follow the instructions here: to add a valid * * App ID inside the AndroidManifest. Google Ad Manager publishers should * * follow instructions here: * ****************************************************************************** at android.app.ActivityThread.installProvider(ActivityThread.java:7192) at android.app.ActivityThread.installContentProviders(ActivityThread.java:6727) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6618) at android.app.ActivityThread.access$2000(ActivityThread.java:268) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1995) at android.os.Handler.dispatchMessage(Handler.java:109) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:7539) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958) Caused by: java.lang.IllegalStateException: ****************************************************************************** * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers * * should follow the instructions here: to add a valid * * App ID inside the AndroidManifest. Google Ad Manager publishers should * * follow instructions here: * ****************************************************************************** at com.google.android.gms.internal.ads.zzabg.attachInfo(Unknown Source:16) at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(Unknown Source:3) at android.app.ActivityThread.installProvider(ActivityThread.java:7187) ... 10 more Wait Until Element Is Enabled将返回true,但是该元素仍然不可单击,因为它被另一个元素隐藏/重叠。

我可以在我的应用中解决这种情况。我收到的错误是:

Wait Until Element Is Visible

如果不编写外部库,似乎没有任何“智能”解决方案。目前,最好的方法是使用此方法:

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

像这样使用它:

*** 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}

答案 4 :(得分:0)

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

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

这将在两次故障之间以10s的间隔运行测试5次,从而完全消除了在代码中进行任何显式睡眠的需要。可以更改两个值以更好地满足您的需求。请注意,Wait Until Keyword Succeeds关键字可以与包括Input Text在内的任何操作一起使用,这意味着,如果更改测试用例的每一行以使用此关键字,则可以保证测试会通过,而无论网站的响应时间。