我在应用程序中有一个锚定覆盖,我需要做3个动作:输入文本,选择一个复选框,然后单击确定。我可以找到元素并在IRB中浏览这些元素。但是在webdriver运行时,相同的行代码失败了。我用rspec。我得到Selenium :: WebDriver :: Error :: ElementNotVisibleError的错误: 元素当前不可见,因此可能无法与
进行交互HTML看起来像:
<div id="xwt_widget_form_AnchoredOverlay_0_Popover" class="xwtPopover xwtAnchoredOverlayPopover dijitTooltipDialog xwt_BasePickerPopover disablePointer xwtAnchoredOverlayPopoverBelow dijitTooltipABLeft dijitTooltipBelow" wairole="presentation" widgetid="xwt_widget_form_AnchoredOverlay_0_Popover" style="top: 0px; visibility: visible;">
在此之下,它是一个文本框表:
<td class="gridxCell " style="width:100px;;min-width:100px;;" aria-grabbed="false">
<div class="quickFilterItem forHeader-ipaddress">
<div id="widget_dijit_form_TextBox_22" class="dijit dijitReset dijitInline dijitLeft dijitTextBox" role="presentation" widgetid="dijit_form_TextBox_22" style="width: 100px;">
<div class="dijitReset dijitInputField dijitInputContainer">
<input id="dijit_form_TextBox_22" class="dijitReset dijitInputInner" type="text" autocomplete="off" data-dojo-attach-point="textbox,focusNode" tabindex="0" value="">
</div>
这是我的代码:
def overlay_method(text)
@browser.div(:class => 'xwt_BasePickerButton dijitDownArrowButton').click
sleep 3
@browser.div(:class => 'quickFilterItem forHeader-ipaddress').wait_until_present(10)
@browser.div(:class => 'quickFilterItem forHeader-ipaddress').text_field.set text
sleep 1
@browser.span(:class => 'gridxIndirectSelectionCheckBox dijitReset dijitInline dijitCheckBox', :index => 0).click
sleep 3
@browser.div(:class => 'xwtAnchoredOverlayPopoverBelow').span(:text => 'OK').wait_until_present(10)
@browser.div(:class => 'xwtAnchoredOverlayPopoverBelow').span(:text => 'OK').click
end
在运行中,看起来叠加层在尝试输入文本或执行任何操作时都会崩溃。 请求提供一些我可以尝试的指示。令人困惑的是,它在irb上工作但不在脚本中运行。我尝试过使用focus,hover,send_keys等。
更新:想出保持浏览器顶部的任何窗口运行,使其工作。我将小终端窗口保持活动(焦点)在浏览器运行的顶部,&amp;我觉得它有效。所以现在在这种行为中如何处理运行。
寻找一些投入。非常感谢。
谢谢
答案 0 :(得分:0)
我找到了答案。
触发锚定叠加层的点击动作并不是webdriver真正认可的那种东西。因此,虽然显示了叠加层,但webdriver抱怨说这些元素无法进行交互。 我使用.send_keys:输入而不是.click。这使得webdriver能够理解叠加层已经显示,并且可以轻松地与叠加层上的元素进行交互。
玉