我希望在嵌套的for循环中只实现一次WebDriverWait。我的想法是等到它找到价格($)或5s,然后继续前进,但在for delta循环中只做一次,在for d循环中重置。好的,for d循环的第一次迭代,但是第二次迭代不再等待。它进入if delay,但不执行等待。
看起来它不会再等待了,因为它已经执行了此操作(会话代码不会更改?)?我需要迭代等待变量吗?有没有一种干净利落的方法呢?
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
for d in range (0, len(date_array)-duration_max):
delay = True
#Other Code
for delta in range (duration_min,duration_max):
try:
if delay:
wait =WebDriverWait(browser, 5)
wait.until(EC.text_to_be_present_in_element((By.XPATH,"//*.../div[" + str(date_array[d + delta][2]) + "]/div/div[2]"), "$"))
delay = False
except:
delay = False
pass
try:
date_value = browser.find_element_by_xpath("...").text
price_value = browser.find_element_by_xpath("...").text
except:
pass等待中调用的XPath根据它从date_array中提取的d和增量索引位置始终是唯一的(不确定这是否重要,仅供参考)。
发布于 2021-09-05 03:17:38
问题说明:
显式等待
它们允许您的代码halt program execution或freeze the thread,直到condition you pass it resolves。
使用certain frequency调用condition,直到等待的timeout为elapsed。这意味着只要条件返回falsy值,it will keep trying and waiting.
由于显式等待允许您等待某个条件发生,因此它们非常适合于在浏览器及其DOM和WebDriver脚本之间同步状态。
哪里出了问题?
WebDriverWait时,只需定义一次,即可在代码中的任何位置使用该引用。text_to_be_present_in_element用于:-“检查指定元素中是否存在给定文本的期望值。”
解决方案
WebDriverWait。visibility_of_element_located而不是text_to_be_present_in_element.代码:-
wait = WebDriverWait(browser, 5)
for d in range (0, len(date_array)-duration_max):
delay = True
#Other Code
for delta in range (duration_min, duration_max):
try:
if delay:
some_text = wait.until(EC.visibility_of_element_located((By.XPATH, "//*.../div[" + str(date_array[d + delta][2]) + "]/div/div[2]"))).text
assert some_text in "$"
#wait.until(EC.text_to_be_present_in_element((By.XPATH, "//*.../div[" + str(date_array[d + delta][2]) + "]/div/div[2]"), "$"))
delay = False
except:
delay = False
pass
try:
date_value = browser.find_element_by_xpath("...").text
price_value = browser.find_element_by_xpath("...").text
except:
pass备注:
这将返回一个web element.
wait.until(EC.visibility_of_element_located((By.XPATH, "//*.../div[" + str(date_array[d + delta][2]) + "]/div/div[2]")))因此,您可以像使用driver.find_element一样使用.text或.send_keys等
https://stackoverflow.com/questions/69059993
复制相似问题