亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有什么方法可以限制 Selenium 查找元素的時間嗎?

有什么方法可以限制 Selenium 查找元素的時間嗎?

繁花不似錦 2022-01-18 16:06:54
我正在嘗試使用 Python Selenium Chrome 驅動程序自動化谷歌地圖,我的代碼很穩定,可以得到我需要的東西,但不是性能時間。我使用迭代代碼通過 Google Maps 獲取商家數據,使用 Selenium 獲取 1 個商家數據的時間速率低于 1 秒,但是當代碼捕獲異常時,需要很長時間,例如 6-7 秒。以下是執行時間的一些摘要:https://picoolio.net/image/dgxC(正常執行時間)https://picoolio.net/image/dgxT(Open Hour發生異常時的執行時間,太長了)https://picoolio.net/image/dgxV(發生異常時的執行時間,有時按預期運行)這是一些獲取開放時間列表的代碼:try:      openhour = wait(driver, 1).until(EC.visibility_of_element_located((By.XPATH,                            './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))      driver.execute_script("arguments[0].scrollIntoView(true);", openhour)      openhour.click()      openhourstacked = wait(driver, 1).until(EC.visibility_of_element_located((By.CLASS_NAME,                                   'section-open-hours-container-hoverable'))).get_attribute("aria-label")      openhourlist = openhourstacked.split(",")      openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")      openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]      except NoSuchElementException:         openhourlist = []         print("No Open Hour list in this merchant!")         openhour_trig = True      except WebDriverException:         openhourlist = []         print("Failed to load Open Hour list in this merchant!")         openhour_trig = True很多建議說要正確地進行顯式等待,我應該使用 WebDriverWait 和 EC(預期條件)的組合,我直接使用上面的代碼進行了嘗試,但是 WebDriverWait 似乎不適用于所有傳入的異常,換句話說,有時成功,有時失敗。我試圖用 替換EC.visibility_of_all_element_located,EC.presence_of_all_element_located但它沒有任何區別。我希望在發生任何異常時使執行時間仍然順暢,除了上述方式之外,還有什么方法可以讓 Selenium 在超時的情況下停止查找元素?或者這是一個互聯網連接問題?歡迎任何想法!是的,這樣它確實避免了異常,但這會像以前一樣重復搜索,因此當找不到元素時,它可能會再次進行長達 6-7 秒的長時間搜索。明確等待在這些術語中也沒有真正的幫助思考
查看完整描述

2 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

概括:

在您的代碼中嘗試增加顯式等待的時間。它不會減慢您的速度,但會阻止這些異常。嘗試 5 秒而不是 1 秒。試試這個wait(driver,5)


我們使用等待是因為加載 DOM 需要時間,有時我們需要等待頁面/元素加載/隱藏/更改,我們必須根據更改采取行動。
顯式等待的作用是等待給定的時間來滿足預期的條件,并每 500 毫秒檢查一次條件是否滿足。這樣,在執行下一個任務之前,您最多會損失 500 毫秒的時間。如果條件沒有及時滿足,就會拋出超時異常。顯式等待并不能解決您的所有問題。

您仍然需要檢查可能的異常并決定發生這種情況時要做什么。有些網站加載速度很慢,或者您的帶寬有時很低。那么你就沒有辦法加快這個過程了。

您必須首先分析頁面并確定會發生什么。如果您正在等待某個元素存在但有可能它可能不存在,那么您應該相應地處理異常。

如果您正在檢查頁面中是否存在元素,那么最好不要等待元素,而是嘗試使用find_elements_并檢查列表的大小。這樣你就可以避免異常并且會更快。

driver.find_elements(By.ID, "locator").size()>0


查看完整回答
反對 回復 2022-01-18
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

是的,顯式等待(webdriver wait)解決了這個問題。其他簡單的方法是創建一個帶有時間秒數的 for 循環并在循環內寫入 find 元素,因此即使失敗,它也會檢查 180 秒并寫入超出預期等待時間的條件


  for (int second = 0; second < 60; second++) {

  try {} 

  catch (WebDriverException we) 

  {}

  if (second >= 60) {

  //write failure 

  }


查看完整回答
反對 回復 2022-01-18
  • 2 回答
  • 0 關注
  • 417 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號