使用selenium[Python]单击按钮

使用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'

我正在打开一个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')" 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>&nbsp;
    <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>&nbsp;
    <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&amp;zzx-language=EN&amp;zzx-domainRelax=min&amp;zzzrole=zzfdecs" style="display: block; visibility: visible;"></iframe></div>

      <frame src="/zzx/bc/bsp/zzx/crmcmp_hdr/bspwdapplication.do?zzx-client=001&amp;zzx-language=EN&amp;zzx-domainRelax=min&amp;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')]"))
    )