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

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

如何通過 Python 正確使用 Selenium 中的 WebDriverWait?

如何通過 Python 正確使用 Selenium 中的 WebDriverWait?

慕神8447489 2023-02-22 15:57:22
既然這個問題已經解決了,我只是想我會添加一個編輯。替換這兩個 time.sleep() 使我的程序從 180 秒減少到 30 秒。WebDriverWait 大大改進了運行時間。我只是想確定我是否正確設置了 WebDriverWait。這是我的工作腳本,我使用 time.sleep()for x,sequence in enumerate(table.find_elements_by_xpath('//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr/td[9]'),1):        driver.find_element_by_xpath(f'//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr[{x}]/td[9]/span[2]').click()        time.sleep(5)        element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button')))        seq_info=driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[2]/div')        seq_list.append([seq_info.text])        driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button').click()        time.sleep(5)簡而言之,它遍歷一個表格,單擊一個打開彈出窗口的按鈕,從彈出窗口中提取文本,然后關閉所述彈出窗口。我必須等待彈出窗口打開并完全關閉。我目前正在使用 time.sleep(),但我正在嘗試切換到 WebDriverWait。這就是我實施它的方式。for x,sequence in enumerate(table.find_elements_by_xpath('//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr/td[9]'),1):        driver.find_element_by_xpath(f'//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr[{x}]/td[9]/span[2]').click()        element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button')))        seq_info=driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[2]/div')        seq_list.append([seq_info.text])        driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button').click()        time.sleep(5)但是,上述方法不起作用。我收到此錯誤:driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button').click()selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable如果我返回 time.sleep(),這就消失了,因此讓我覺得我一定是錯誤地設置了我的 WebDriverWait。等待是瀏覽器的打開和關閉,所以我們必須等到按鈕出現,所以我把按鈕本身的xpath放在了WebDriverWait中。這是正確的設置嗎?
查看完整描述

1 回答

?
繁花不似錦

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

簡短的回答,,雖然在語法上是正確的,但您沒有以最佳方式使用WebDriverWait。

除了WebDriverWait,您還使用time.sleep().

時間.睡眠(秒)

time.sleep(secs)在給定的秒數內暫停當前線程的執行。該參數可以是一個浮點數,以指示更精確的睡眠時間。實際暫停時間可能比請求的時間短,因為任何捕獲的信號都會在執行該信號的捕獲例程后終止 sleep()。此外,由于系統中其他活動的調度,暫停時間可能比請求的任意時間長。

您可以在How to sleep webdriver in python for milliseconds中找到詳細的討論

而且,

  • for你打算迭代而不是/tr[{x}]你需要的循環中//tr[{x}]

  • 要收集您需要使用的所需文本visibility_of_element_located()。

  • <button>本質上是交互式的,因此您不需要在需要與它們交互時才presence_of_element_located()使用它們。element_to_be_clickable()

  • 一個可能的解決方案:

for x,sequence in enumerate(table.find_elements_by_xpath('//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody/tr/td[9]'),1):

      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="gwzSngrOrderResultPanelRoot"]/table/tbody//tr[{x}]/td[9]/span[2]'))).click()

      seq_list.append(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='gwzViewResultsModalDialog']/div/div/div[2]/div"))).text)

      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button'))).click()



查看完整回答
反對 回復 2023-02-22
  • 1 回答
  • 0 關注
  • 258 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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