点击使用selenium [Python]的按钮

问题描述 投票:1回答:5

我打开一个URL并尝试点击下面描述的Search按钮:

<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>

这里当我复制search按钮元素J22_MNQ_LOP_V1WR_SEARCH_BTN的xpath时,它给了我超时错误。

这是代码:

import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("<URL>")
time.sleep(10)

element = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="J22_MNQ_LOP_V1WR_SEARCH_BTN"]'))
)
element.click()

我试着用XPATHID以及这个增加的时间等待检查我得到的异常是否解决,但遗憾的是没有任何作用,有人可以在这帮忙吗?

追溯 :

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)">
python python-3.x selenium selenium-webdriver selenium-chromedriver
5个回答
0
投票

根据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()

0
投票

首先:使用time.sleep后跟WebdriverWait完全取消了WebdriverWait的值。我甚至可能把它形容为低级邪恶。

至于你的问题 - 我还不确定该元素是否有待找到。你可以在你的浏览器开发工具中进入控制台并键入$ x('YOUR_XPATH_HERE'),按回车并告诉我它是否返回了预期的元素?如果没有,并且您在页面上看到该元素,则问题在于您的定位器。

如果您看到该元素,但无法使用已知良好的定位器找到该元素,请查找可能抓住您的焦点的iframe或其他元素。这可能需要webdriver.switch_to()


0
投票

尝试:

element = driver.find_element_by_xpath("//*[contains(@class, 'th-') and contains(text(), 'Search')]")
element.click()

如果这返回Unable to locate element,请先使用它:

element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//*[contains(@class, 'th-') and contains(text(), 'Search')]"))
    )

0
投票

Switch to the frame before interacting

Selenium一次只能与单个文档进行交互。如果您想要的元素位于框架中,则需要在搜索或单击之前“切换到”该框架:

iframe = driver.find_element_by_name("UiApplicationFrame")
driver.switch_to.frame(iframe)
try:
    element = driver.find_element_by_link_text("Search")
    element.click()
finally:
    driver.switch_to.default_content

附:像人一样搜索

请注意,我的答案以不同的方式搜索元素。

虽然通过ID搜索可能现在可以使用,但它可能并不总是如此。页面的实现很容易改变,破坏了你的脚本。

为了更好地抵御这种变化,像人类一样搜索:通过文本查找交互元素。

Bonus: Simplify with Capybara

这可以通过使用capybara-py进一步简化,with page.frame("UiApplicationFrame"): page.click_link("Search") 在Selenium上面提供了一个有用的层:

click_link

除了简化查找​​和切换进出框架的工作之外,Capybara还提供帮助程序,例如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元素的公共交互。它还可以同步所有内容,例如,如果链接尚未可见或尚未可点击,则重试。


-1
投票

这与我也面临的硒问题一样,但你可以用这样的方法解决它:

qazxswpoi

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.