[英]Clicking on a button using selenium [Python]
我正在打開一個網址,並嘗試單擊下面描述的“ 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'),按Enter並告訴我它是否返回了預期的元素? 如果沒有,並且您在頁面上看到該元素,則問題出在您的定位器上。
如果您看到了該元素,但是用一個已知的良好定位器找不到它,請尋找一個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進一步簡化該操作,它在Selenium之上提供了一個有用的層:
with page.frame("UiApplicationFrame"):
page.click_link("Search")
除了簡化查找和切換幀的工作之外,Capybara還提供了諸如click_link
助手,用於與語義可訪問的HTML元素執行常見的交互。 它還會同步所有內容,例如,通過重試該鏈接尚不可見或不可單擊來進行同步。
我曾經也遇到過硒問題,但是您可以使用以下方法解決它:
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()
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.