[英]Python-Selenium: Wait for an element to exist then return True or false
我正在嘗試創建一個函數來幫助確定某個元素是從網頁中出現還是消失。
這就是我所擁有的。
def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
wait = WebDriverWait(driver, seconds)
# waiting for element to exist
if not negative:
try:
wait.until(EC.presence_of_element_located(*by))
return True
except:
return False
#wait for element not to exist
else:
try:
wait.until_not(EC.presence_of_element_located(*by))
return True
except:
return False
唯一的問題是無論如何調用或元素是否存在,它總是返回 FALSE
wait_for_element_to_exist(self.driver, (By.XPATH, 'xpath'))
返回False
wait_for_element_to_exist(self.driver, (By.CLASS, 'class'), negative=True)
返回False
我究竟做錯了什么?
您遇到的問題是您對 Presence_of_element_located(*by) 的調用
它拋出一個 TypeError,因為 *by 解包成兩個元素,這比它預期的多一個。 將*by
更改為by
。
一旦你這樣做了,如果你在這個頁面上說,
wait_for_element_to_exist(browser, (By.ID, 'question-header'))
它返回真
和wait_for_element_to_exist(browser, (By.ID, 'timeout-header'))
返回 False。
我建議在說之后將您的except
更改為except TimeoutException
:
from selenium.common.exceptions import TimeoutException
當我寫過類似的函數時,我將 locate 方法和關聯的字符串作為單獨的參數傳遞,這樣可能更容易閱讀和調試。
我認為您的代碼出錯了,因為您使用的是 try except 塊。 如果 Selenium 沒有找到該元素,我認為它沒有找到錯誤——它只返回 None。
所以在我過去為這個問題編寫的類似代碼中,我做了這樣的事情:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "h2"))
)
if element:
return True
else:
return False
因此應用於您的代碼,如下所示:
def wait_for_element_to_exist(driver, by, seconds=15, negative=False):
wait = WebDriverWait(driver, seconds)
# waiting for element to exist
if not negative:
wait_result = wait.until(EC.presence_of_element_located(*by))
if wait_result:
return True
else:
return False
#wait for element not to exist
else:
wait_result = wait.until_not(EC.presence_of_element_located(*by))
if wait_result:
return True
else:
return False
希望有效嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.