python - 如何在 Dojo-heavy web 上单击按钮
问题描述
我在使用 python+selenium+phantomjs 进行自动 Web 测试时遇到了问题。
Web 是重 Dojo 的 Web 应用程序。为了修改记录,我需要先点击 drop_button 修改
,然后点击“修改”,但它总是报告找不到元素。
有人可以帮我调查一下吗?“修改”元素是display:none
,我尝试使用JS启用它,但失败了。
这是修改
元素的来源
<div class="dijit dijitLeft dijitInline dijitDropDownButton" dojoattachevent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey" widgetid="dijit_form_DropDownButton_6">
<div class="dijitRight">
<button class="dijitStretch dijitButtonNode dijitButtonContents" type="button" dojoattachpoint="focusNode,titleNode" wairole="button" waistate="haspopup-true,labelledby-dijit_form_DropDownButton_6_label" role="button" aria-haspopup="true" aria-labelledby="dijit_form_DropDownButton_6_label" id="dijit_form_DropDownButton_6" tabindex="-1" aria-valuenow="" aria-disabled="false">
<div class="dijitInline " dojoattachpoint="iconNode"></div><span class="dijitButtonText" dojoattachpoint="containerNode,popupStateNode" id="dijit_form_DropDownButton_6_label">修改</span><span class="dijitA11yDownArrow">▼</span>
</button>
</div>
</div>
这是modify
元素的来源:
<table class="dijit dijitMenu dijitReset dijitMenuTable" wairole="menu" dojoattachevent="onkeypress:_onKeyPress" role="menu" id="dijit_Menu_32" widgetid="dijit_Menu_32" style="display: none;">
<tbody class="dijitReset" dojoattachpoint="containerNode">
<tr class="dijitReset dijitMenuItem" dojoattachevent="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick" id="dijit_MenuItem_76" widgetid="dijit_MenuItem_76" tabindex="-1">
<td class="dijitReset">
<div class="dijitMenuItemIcon " dojoattachpoint="iconNode"></div>
</td>
<td tabindex="-1" class="dijitReset dijitMenuItemLabel" dojoattachpoint="containerNode" wairole="menuitem" role="menuitem" aria-disabled="false">Modify</td>
<td class="dijitReset" dojoattachpoint="arrowCell">
<div class="dijitMenuExpand" dojoattachpoint="expand" style="display:none"><span class="dijitInline dijitArrowNode dijitMenuExpandInner">+</span></div>
</td>
</tr>
<tr class="dijitReset dijitMenuItem" dojoattachevent="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick" id="dijit_MenuItem_77" widgetid="dijit_MenuItem_77" tabindex="-1">
<td class="dijitReset">
<div class="dijitMenuItemIcon " dojoattachpoint="iconNode"></div>
</td>
<td tabindex="-1" class="dijitReset dijitMenuItemLabel" dojoattachpoint="containerNode" wairole="menuitem" role="menuitem" aria-disabled="false">Clone</td>
<td class="dijitReset" dojoattachpoint="arrowCell">
<div class="dijitMenuExpand" dojoattachpoint="expand" style="display:none"><span class="dijitInline dijitArrowNode dijitMenuExpandInner">+</span></div>
</td>
</tr>
</tbody>
</table>
这是代码:
menu = driver.find_element_by_css_selector("#dijit_form_DropDownButton_0")
hidden_submenu = driver.find_element_by_css_selector("#dijit_MenuItem_31 > td:nth-child(2)")
actions = webdriver.common.action_chains.ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()
解决方案
我看到您的代码与selenium 动作链的示例非常相似,为什么不让它更简单呢?您只是移动到修改
菜单而不是单击它,因此当您尝试单击子菜单时将找不到
无论如何,如果修改
执行了点击并且您仍然无法点击子菜单,我建议在点击之间添加一个硬编码的等待时间,例如:
import time
time.sleep(3)
如果可行,请执行动态等待时间而不是硬编码
推荐阅读
- android - webview中的PDF文件点击在少数设备中不起作用
- reactjs - 为什么拼接只删除最后一个元素?
- typescript - ReactNative+rxJs+打字稿示例
- angular - 根据文件上传百分比以角度显示 mat-spinner
- c# - 从对象列表中查找唯一对象的最简单方法
- docker - 尝试在 Kubernetes 上实现 Jupyterhub
- c++ - 处理霍夫曼压缩/解压缩中的最后一个字节
- mysql - 在本地设置 express,mysql 应用程序并且工作正常,但是如何在 AWS ubuntu 服务器中设置它相同的应用程序
- angular7 - Angular 7 HTTP 拦截器不工作
- javascript - 未找到没有参数的“export2”反向