【问题标题】:Selenium: Wait for empy element (span) to contain any textSelenium:等待空元素(跨度)包含任何文本
【发布时间】:2019-03-27 01:45:40
【问题描述】:

所以,我有一个关于加载数据缓慢的问题,这会导致我的 Selenium 关闭。

页面本身完成加载,但随后我在指定的跨度内以随机间隔显示数据(正在运行的脚本可能需要 X 时间)。它可能显示为空或带有字符串“n/a”。

注意:chart-data-window-item-value 类不是唯一的,我必须使用 XPATH 找到正确的 div/span。

我正在等待一个 span 用随机小数填充,然后继续。

空跨度:

<div class="chart-data-window-item-value"><span style="color:"></span></div>

<div class="chart-data-window-item-value"><span style="color:">n/a</span></div>

加载数据后:

<div class="chart-data-window-item-value"><span style="color:rgba(255, 127, 0, 1)">73.26000000</span></div>

我尝试了各种方法,最后是:

# wait = WebDriverWait(browser, 10).until(EC.text_to_be_present_in_element_value((By.XPATH, '/html/body/div[1]/div[3]/div/div[1]/div[1]/div[3]/div/div[2]/div[1]/div[3]/div[2]/div[10]/div[2]/span'), r"(?<=\()[0-9]*)"))

运气不好。

有什么建议吗?

【问题讨论】:

  • 你试过time.sleep()吗?这对我有用。还将pageLoadStrategy 设置为none,这将绕过一些防御机制。
  • 请发布一个指向该页面的链接...必须是比这更好的定位器。那将是非常脆弱的。它从html 标签开始,经历了太多的层次,同时使用了大量的索引。其中任何一个都是自找麻烦,但你已经把这三个结合起来了。
  • @jeffc 我不能,该指标使用了我们专有的,但是,它添加到这样的图表中,tradingview.com/chart/LW1VvtHB 左侧的“数据表”表示它的外观。另外,是的,定位器是垃圾,但它是 WIP。

标签: python selenium selenium-webdriver web-scraping selenium-chromedriver


【解决方案1】:

我认为你让这变得比它需要的更复杂。如果您查看the docs 中的text_to_be_present_in_element,您将在右侧看到一个[来源] 链接。单击它并查看源代码以了解其工作原理。检查的条件是self.text in element_text,它是一个包含。有了这些信息,您应该可以在元素文本中查找.,这表明您的号码已经出现。

WebDriverWait(browser, 10).until(EC.text_to_be_present_in_element_value((By.XPATH, '/html/body/div[1]/div[3]/div/div[1]/div[1]/div[3]/div/div[2]/div[1]/div[3]/div[2]/div[10]/div[2]/span'), '.'))

您的代码使用的是正则表达式(我认为)...该方法不接受正则表达式,可能只是将其作为实际字符串处理。

【讨论】:

    【解决方案2】:

    尝试使用自定义预期条件来检查跨度是否包含有效文本而不是正则表达式。

    class element_has_some_valid_text(object):
      def __init__(self, locator):
        self.locator = locator
        self.css_class = css_class
    
      def __call__(self, driver):
        element = driver.find_element(*self.locator)   
        if element.text and element.text != "n/a":
            return element
        else:
            return False
    
    wait = WebDriverWait(driver, 60)
    element = wait.until(element_has_some_valid_text((By.XPATH, 'your xpath goes here'))
    

    还有你的xpath要长,请检查它是否是唯一的。向问题添加更多 html 详细信息,以帮助您简化 xpath。

    【讨论】:

    • 这行不通,因为他说有时在加载之前它包含“n/a”。
    • 是的。将 n/a 条件添加到自定义等待:)
    • css_class 未定义
    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 2021-08-07
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多