【问题标题】:How to select a dynamic list element (kendoUI) in robot framework如何在机器人框架中选择动态列表元素(kendoUI)
【发布时间】:2018-12-29 02:18:06
【问题描述】:

我正在尝试使用 Robot Framework (Selenium) 测试 UI。我有一个动态填充的下拉菜单,我必须选择其中的一个文本。我可以单击下拉元素,然后将列表显示为弹出窗口。但无法选择任何元素。当我尝试使用 Select from List 访问下拉列表时,它返回一个错误,指出它不是列表。由于它是动态的,因此 ID 不是恒定的。

*<kendo-dropdownlist name="sel" style="width: 400px;" ng-reflect-data="[object Object],[object Object" ng-reflect-text-field="Name" ng-reflect-value-field="Id" ng-reflect-default-item="[object Object]" ng-reflect-value-primitive="true" ng-reflect-name="sel" class="k-widget k-dropdown k-header ng-valid ng-touched ng-dirty" ng-reflect-model="-9999">
 <span role="listbox" unselectable="on" class="k-dropdown-wrap k-state-default k-state-focused" ng-reflect-ng-class="[object Object]" id="5c2a0848-f6fa-433f-a927-8b645ac4047b" dir="ltr" readonly="false" tabindex="0" aria-disabled="false" aria-readonly="false" aria-haspopup="true" aria-expanded="false" aria-owns="c7cb9422-f181-4b66-905e-eaa05305a0e9" aria-activedescendant="b0f86e8c-1fea-4bee-9367-39a207fa4859-undefined">
<span unselectable="on" class="k-input" ng-reflect-ng-class="[object Object]">
<span unselectable="on" class="k-select" ng-reflect-ng-class="[object Object]">
</span>
</kendo-dropdownlist>*


*<kendo-popup class="ng-tns-c7-14 k-animation-container ng-star-inserted k-animation-container-shown" dir="ltr" style="left: 189.6px; top: 338.2px; min-width: 400px; width: 400px;">
<div class="k-popup ng-trigger ng-trigger-toggle k-list-container k-reset" ng-reflect-klass="k-popup" ng-reflect-ng-class="k-list-container,k-reset">
<div kendodropdownsselectable="" class="k-state-focused k-state-selected ng-star-inserted k-list-optionlabel" ng-reflect-ng-class="[object Object]" ng-reflect-index="-1" aria-selected="true" style="">Please Select</div>
<kendo-list ng-reflect-data="[object Object],[object Object" ng-reflect-text-field="Name" ng-reflect-value-field="Id" ng-reflect-height="200" ng-reflect-show="true" ng-reflect-id="c7cb9422-f181-4b66-905e-eaa053" ng-reflect-option-prefix="b0f86e8c-1fea-4bee-9367-39a207" class="ng-star-inserted" style="">
<div unselectable="on" class="k-list-scroller" ng-reflect-ng-class="[object Object]" style="max-height: 200px;">
<ul role="listbox" class="k-list k-reset" ng-reflect-ng-class="[object Object]" id="c7cb9422-f181-4b66-905e-eaa05305a0e9" aria-hidden="false">
<li kendodropdownsselectable="" role="option" class="k-item ng-star-inserted" ng-reflect-ng-class="[object Object]" ng-reflect-index="0" ng-reflect-multiple-selection="false" id="b0f86e8c-1fea-4bee-9367-39a207fa4859-5560" tabindex="-1">
................
................
<li kendodropdownsselectable="" role="option" class="k-item ng-star-inserted" ng-reflect-ng-class="[object Object]" ng-reflect-index="10" ng-reflect-multiple-selection="false" id="b0f86e8c-1fea-4bee-9367-39a207fa4859-5360" tabindex="-1">
</ul>
</div>
</kendo-list>
</div>
</kendo-popup>*

任何帮助或指示将不胜感激。谢谢。

【问题讨论】:

标签: selenium dynamic frameworks robotframework dropdown


【解决方案1】:

最简单的选择是调用一些 JavaScript。这是一个例子:

Custom Select From List by Label
    [Arguments]    ${locator}    ${label}    ${timeout}=${global_timeout}
    ${tempId} =    Generate Random String    8
    Wait Until Page Contains Element    locator=${locator}    timeout=${timeout}
    ${origId} =    Get Element Attribute    ${locator}    attribute=id
    Run Keyword If    "${origId}"=="${EMPTY}"    Assign Id To Element    locator=${locator}    id=${tempId}
    ${elementId} =    Set Variable If    "${origId}"=="${EMPTY}"    ${tempId}    ${origId}
    Execute Javascript    var dropdownlist = $find("${elementId}"); var itemByText = dropdownlist.findItemByText("${label}"); itemByText.select();

要补充一点:更好的方法是在 Python 中实现它(作为一个简单的关键字)。这是我已经计划在我的项目中并且在我们的路线图上的东西。基本上,机器人的性能随着每条记录线而降低,如果你有 2k+ 包,你可以很容易地注意到差异。因此我开始执行以下操作:

def select_checkbox(locator):
    seleniumlib = BuiltIn().get_library_instance('SeleniumLibrary')
    seleniumlib.wait_until_page_contains_element(locator)
    checkbox = seleniumlib.find_element(locator)
    elementId = seleniumlib.get_element_attribute(locator,"id")
    if elementId=='':
        elementId = uuid.uuid4()
        seleniumlib.assign_id_to_element(locator, elementId)
    seleniumlib.execute_javascript('$("#' + elementId + ':not(:checked)").click();')

它做同样的工作,但速度更快。然后,您可以使用以下方法将自定义关键字设置在原始 SeleniumLibrary 之前:

Set Library Search Order    MyCustomSeleniumLibrary    SeleniumLibary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2016-11-25
    • 2017-09-10
    相关资源
    最近更新 更多