首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >硒循环WebDriverWait

硒循环WebDriverWait
EN

Stack Overflow用户
提问于 2021-09-05 01:25:27
回答 1查看 30关注 0票数 0

我希望在嵌套的for循环中只实现一次WebDriverWait。我的想法是等到它找到价格($)或5s,然后继续前进,但在for delta循环中只做一次,在for d循环中重置。好的,for d循环的第一次迭代,但是第二次迭代不再等待。它进入if delay,但不执行等待。

看起来它不会再等待了,因为它已经执行了此操作(会话代码不会更改?)?我需要迭代等待变量吗?有没有一种干净利落的方法呢?

代码语言:javascript
复制
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和增量索引位置始终是唯一的(不确定这是否重要,仅供参考)。

EN

回答 1

Stack Overflow用户

发布于 2021-09-05 03:17:38

问题说明:

显式等待

它们允许您的代码halt program executionfreeze the thread,直到condition you pass it resolves

使用certain frequency调用condition,直到等待的timeoutelapsed。这意味着只要条件返回falsy值,it will keep trying and waiting.

由于显式等待允许您等待某个条件发生,因此它们非常适合于在浏览器及其DOM和WebDriver脚本之间同步状态。

哪里出了问题?

  1. 定义WebDriverWait时,只需定义一次,即可在代码中的任何位置使用该引用。

  1. text_to_be_present_in_element用于:-

“检查指定元素中是否存在给定文本的期望值。”

解决方案

  1. 具有如下定义的全局WebDriverWait
  2. 使用visibility_of_element_located而不是text_to_be_present_in_element.

代码:-

代码语言:javascript
复制
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.

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69059993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档