0

我的代碼掃描大量的互聯網網頁與chromedriver並搜索同一元素在每個頁面「find_elements_by_xpath」蟒蛇硒 - 需要花費大量的時間,當它沒有找到元素

Lines = driver.find_elements_by_xpath(
        '//*[@id="top"]/div[contains(@style, "display: block;")]/' 
        'div[contains(@style, "display: block;")]//tbody//a[contains(@title, "Line")]') 

當它發現,一個或多個,它工作得很快,很好。但是,當XPath不存在時,它將運行6-7秒,然後繼續。

我可以限制搜索1秒嗎?如果它在一秒鐘內找不到,就繼續?有沒有辦法做到這一點?

+0

請添加代碼等待6-7秒。爲什麼不把等待時間從6秒降低到1秒有什麼原因? – JeffC

回答

1

嘗試如下使用ExplicitWait

from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait as wait 
from selenium.common.exceptions import TimeoutException 

try: 
    Lines = wait(driver, 1).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="top"]/div[contains(@style, "display: block;")]/' 
       'div[contains(@style, "display: block;")]//tbody//a[contains(@title, "Line")]'))) 
except TimeoutException: 
    pass 

這應該讓你等待1秒中的至少一個元素,直到並獲得所需WebElements清單或者什麼也不做,否則

+1

使用'presence_ *'可能很危險,因爲它只是表示元素在DOM中,但不一定是可訪問/可點擊的。另外,當你使用'all_elements'時,它會等待所有*,而不僅僅是第一個。我陷入了麻煩,等待所有人,並發現遇到定位符的一個或多個元素被禁用,不可見等,並且等待會超時。 – JeffC

+0

@JeffC,來自文檔:「期望檢查網頁上至少存在一個元素 。 定位符用於查找元素 返回Web元素一旦找到它們的列表」。另外請注意,OP沒有提到他想要可見/可點擊的元素。考慮到OP使用'find_elements _ ..()'也不會返回可見/可點擊的元素,所以沒有什麼可擔心的:) – Andersson

+1

這可能是文檔的狀態,但它是誤導性的,因爲我以相同的方式解釋它。創建一個包含5個元素的頁面,這5個元素都與一個定位器相匹配,並使其中一個不可見並運行等待。它會超時,因爲它找到了第五個,但它永遠不會變得可見。這不是「至少有一個」......它是「所有位置」。當然,但大多數人不尋找A標籤,然後從不點擊它們...... :)。 – JeffC