为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 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 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信