我打开一个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>
<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>
这里当我复制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()
我试着用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)">
根据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'),按回车并告诉我它是否返回了预期的元素?如果没有,并且您在页面上看到该元素,则问题在于您的定位器。
如果您看到该元素,但无法使用已知良好的定位器找到该元素,请查找可能抓住您的焦点的iframe或其他元素。这可能需要webdriver.switch_to()
尝试:
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')]"))
)
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搜索可能现在可以使用,但它可能并不总是如此。页面的实现很容易改变,破坏了你的脚本。
为了更好地抵御这种变化,像人类一样搜索:通过文本查找交互元素。
这可以通过使用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元素的公共交互。它还可以同步所有内容,例如,如果链接尚未可见或尚未可点击,则重试。
这与我也面临的硒问题一样,但你可以用这样的方法解决它:
qazxswpoi
希望这有帮助。