簡體   English   中英

使用硒單擊按鈕[Python]

[英]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>&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)">

根據要單擊“ 搜索”按鈕的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

PS像人類一樣搜索

請注意,我的答案以另一種方式搜索元素。

雖然按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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM