使用selenium[Python]单击按钮
我正在打开一个URL并尝试单击下面描述的搜索按钮:使用selenium[Python]单击按钮,python,python-3.x,selenium,selenium-webdriver,selenium-chromedriver,Python,Python 3.x,Selenium,Selenium Webdriver,Selenium Chromedriver,我正在打开一个URL并尝试单击下面描述的搜索按钮: <td class="th-sa-tb-bt"> <span class="th-bt-up"> <a href="javascript:void(0)" class="th-bt th-bt-text-em" onclick="thBtMgr.click(this);return htmlbSL(this,2,'J22_MNQ_LOP_V1WR_SEARCH_BTN:SEARCH','0'
<td class="th-sa-tb-bt">
<span class="th-bt-up">
<a href="javascript:void(0)" class="th-bt th-bt-text-em" onclick="thBtMgr.click(this);return htmlbSL(this,2,'J22_MNQ_LOP_V1WR_SEARCH_BTN:SEARCH','0')" onmousedown="thBtMgr.press(this,event);" onfocusout="thBtMgr.unpress(this);" onfocus="thSaveKbFocus(this);" oncontextmenu="return false;" ondragstart="return false;" id="J22_MNQ_LOP_V1WR_SEARCH_BTN" title="Search">
<span class="th-bt-span">
<b class="th-bt-b">Search</b>
</span>
</a>
</span>
<span class="th-bt-spacer">
<!-- -->
</span>
<span class="th-bt-up">
<a href="javascript:void(0)" class="th-bt th-bt-text" onclick="thBtMgr.click(this);return htmlbSL(this,2,'J22_MNQ_LOP_V1WR_CLEAR_BTN:\x23Exit\x23_CLEAR','0')" onmousedown="thBtMgr.press(this,event);" onfocusout="thBtMgr.unpress(this);" onfocus="thSaveKbFocus(this);" oncontextmenu="return false;" ondragstart="return false;" id="J22_MNQ_LOP_V1WR_CLEAR_BTN" title="Clear">
<span class="th-bt-span">
<b class="th-bt-b">Clear</b>
</span>
</a>
</span>
<span class="th-bt-spacer">
<!-- -->
</span>
<span class="th-bt-up">
<a href="javascript:void(0)" class="th-bt th-bt-text" onclick="thBtMgr.click(this);return htmlbSL(this,2,'J22_MNQ_LOP_V1WR_BtnReset:RESET','0')" onmousedown="thBtMgr.press(this,event);" onfocusout="thBtMgr.unpress(this);" onfocus="thSaveKbFocus(this);" oncontextmenu="return false;" ondragstart="return false;" id="J22_MNQ_LOP_V1WR_BtnReset" title="Reset">
<span class="th-bt-span">
<b class="th-bt-b">Reset</b>
</span>
</a>
</span>
<span class="th-bt-spacer">
<!-- -->
</span>
</td>
我尝试了XPATH和ID,同时也增加了等待时间,以检查我得到的异常是否解决,但不幸的是没有任何效果,这里有人能帮忙吗
回溯:
Traceback (most recent call last):
File "C:\Users\vanishka\Desktop\test2\.py", line 18, in <module>
EC.element_to_be_clickable((By.XPATH, 'J22_MNQ_LOP_V1WR_SEARCH_BTN'))
File "C:\Program Files (x86)\Python36-32\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
添加了iframe Html:
<div id="Uiframecontainer" style="display: block; visibility: visible;">
<iframe name="UiApplicationFrame" id="UiApplicationFrame" frameborder="0" title="Uiframeapp" scrolling="no" src="/zzp(ZT1RelV5TkRJd05EWmZYMTlmT0ROZk1qUmZBSkQ2NW81V0h0aUdvOHBZZWk5ZzFnPT0=)/bc/bsp/zzp/crm_ui_frame/main.htm?zzx-client=001&zzx-language=EN&zzx-domainRelax=min&zzzrole=zzfdecs" style="display: block; visibility: visible;"></iframe></div>
<frame src="/zzx/bc/bsp/zzx/crmcmp_hdr/bspwdapplication.do?zzx-client=001&zzx-language=EN&zzx-domainRelax=min&zzxrole=zzfedcs" name="HeaderFrame" id="HeaderFrame" title="" scrolling="no" noresize="noresize" frameborder="0" marginwidth="0" marginheight="0" onload="thtmlbSetOnloadFrameEvents(event, this)">
这与我也面临的selenium问题相同,但您可以通过以下方式解决:
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, '//*[@id="J22_MNQ_LOP_V1WR_SEARCH_BTN"]'))
)
driver.find_element_by_xpath('//*[@id="J22_MNQ_LOP_V1WR_SEARCH_BTN"]').click()
希望这有所帮助。根据HTML,单击搜索按钮,您必须诱导WebDriverWait,并且您可以使用以下代码行:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//td[@class='th-sa-tb-bt']/span[@class='th-bt-up']/a[@class='th-bt th-bt-text-em']/span[@class='th-bt-span']/b[@class='th-bt-b']"))).click()
首先:使用time.sleep后跟WebdriverWait将完全取消WebdriverWait的值。我甚至可以把它描述为低级邪恶 至于你的问题,我还不相信有什么元素可以找到。您可以在浏览器开发工具中的控制台上键入$x‘your_XPATH_HERE’,按enter键并告诉我它是否返回预期的元素吗?如果没有,并且您看到页面上的元素,则问题在于定位器 如果您看到该元素,但使用已知的良好定位器找不到它,请查找可能抓住您焦点的iframe或其他元素。这可能需要webdriver。请切换到尝试:
element = driver.find_element_by_xpath("//*[contains(@class, 'th-') and contains(text(), 'Search')]")
element.click()
如果返回无法定位元素,请首先使用以下命令:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[contains(@class, 'th-') and contains(text(), 'Search')]"))
)
在交互之前切换到帧
Selenium一次只能与单个文档交互。如果所需的元素位于框架中,则需要在搜索或单击之前“切换到”该框架:
iframe=driver.find_element_by_nameUiApplicationFrame
driver.switch_至.frameiframe
尝试:
element=driver.find\u element\u by\u link\u textSearch
元素。单击
最后:
driver.switch_至.default_内容
还有,像人类一样搜索
请注意,我的答案以不同的方式搜索元素
虽然按ID搜索可能暂时有效,但可能并不总是有效。页面的实现可能很容易更改,从而破坏您的脚本
为了更能适应这种变化,像人类一样搜索:通过文本寻找互动元素
好处:用水豚简化
这可以通过使用进一步简化,它在硒上提供了一个有用的层:
对于page.frameUI应用程序框架:
第页。单击链接搜索
除了简化查找和切换帧的工作外,Capybara还提供了一些辅助工具,如click_link,用于与语义、可访问的HTML元素执行常见交互。它还同步所有内容,例如,如果链接还不可见或不可单击,则重试。为什么要等待此元素可单击?它最初是否加载为不可点击,然后动态地使其稍后可点击?我不确定,但等待也应该起作用?尝试删除等待队列,使其直接点击此驱动程序。通过\u xpath'/*[@id=J22\u MNQ\u LOP\u V1WR\u SEARCH\u BTN]查找\u element\u“。单击会导致找不到元素的错误。我还应该尝试其他操作吗?它会给我相同的超时时间。”exception@vanishka当前位置我从一端开始检查,它工作正常。我相信您正在使用一些旧配置,即Chrome浏览器或selenium。你能检查并确认一下吗?@learner8269,你的方法有什么意义?我觉得找同一个元素毫无意义twice@andersson:您是对的,但如果有时元素过时,这可能是我们需要应用此解决方法的情况,因为我以前也遇到过此问题。如果您有任何建议,请添加一些内容。我很难相信元素在您找到一次后会变得过时,您的第二次搜索将解决此问题。。。恐怕您的建议是错误的相同超时例外否它返回一个空元素,如[],当我展开它时,它显示长度:0展开时-proto_uuuuuuuuuuuuu0进一步展开它会显示许多值,如AttributeExistsInArray等。那么您的定位器不正确。请参考我对下面答案的评论,我给你两个XPath来尝试。
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[contains(@class, 'th-') and contains(text(), 'Search')]"))
)