只是想现在这个问题已经解决了,我会添加一个编辑。替换这 2 个 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中。这是正确的设置吗?
编辑:谢谢@DebanjanB 的回答。但是,我在尝试删除我的 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)
#WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="gwzViewResultsModalDialog"]/div/div/div[2]/div')))
seq_info=driver.find_element_by_xpath('//*[@id="gwzViewResultsModalDialog"]/div/div/div[2]/div')
seq_list.append([seq_info.text])
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="gwzViewResultsModalDialog"]/div/div/div[3]/button'))).click()
上面的 time.sleep() 正在等待弹出窗口打开(来自上一次单击),然后才提取数据。如果我使用下面的#WebDriver 删除 time.sleep,它仍然会向前移动,但由于某种原因 seq_info.text 现在是空白的(它不再找到文本)。我不太明白为什么会这样。这不是单击或按钮,我只是想在从中提取信息之前检查弹出窗口是否打开。