Python Selenium:等待empy元素(span)包含任何文本

Python Selenium:等待empy元素(span)包含任何文本,python,selenium,selenium-webdriver,web-scraping,selenium-chromedriver,Python,Selenium,Selenium Webdriver,Web Scraping,Selenium Chromedriver,因此,我有一个问题,就是加载数据的速度太慢,导致我的Selenium无法正常工作 页面本身完成加载,但我随后在指定的范围内以随机间隔显示数据(脚本正在运行,可能需要X个时间)。它可能显示为空或带有字符串“n/a” 注意:图表数据窗口项值类不是唯一的,我必须使用XPATH查找正确的div/span 我希望等待一个跨度填充一个随机小数,然后继续 空跨度: <div class="chart-data-window-item-value"><span style="color:"&g

因此,我有一个问题,就是加载数据的速度太慢,导致我的Selenium无法正常工作

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

注意:图表数据窗口项值类不是唯一的,我必须使用XPATH查找正确的div/span

我希望等待一个跨度填充一个随机小数,然后继续

空跨度:

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

n/a
加载数据后:

<div class="chart-data-window-item-value"><span style="color:rgba(255, 127, 0, 1)">73.26000000</span></div>
73.26000000
我尝试过各种方法,最后是:

# 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]*)"))

#wait=WebDriverWait(浏览器,10)。直到(EC.text_to_be_present_in_element_值((By.XPATH,/html/body/div[1]/div[3]/div/div[1]/div[3]/div/div[2]/div[1]/div[3]/div[2]/div]),r“(?尝试使用自定义预期条件检查span是否有有效文本,而不是regex

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。

我认为您使这个问题变得比需要的更复杂。如果您查看元素中的
text\u to\u be\u present\u
,您将看到右边的a[源代码]链接。单击该链接并查看源代码以了解其工作原理。选中的条件是元素中的
self.text\u 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'), '.'))

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

您是否尝试过
time.sleep()
?这对我很有效。还将
pageLoadStrategy
设置为
none
,这将绕过一些防御机制。请在页面上发布一个链接……必须有一个更好的定位器。这将是非常脆弱的。它从
html
标记开始,经过太多级别,同时使用了大量的indices。其中任何一个都是自找麻烦,但你已经把这三个加在一起了。@jeffc我不能,这个指标是我们自己用的,但是,它被添加到了这样一个图表中,其中的“数据表”“在左侧显示它的外观。另外,是的,定位器是垃圾,但它是WIP。这不起作用,因为他说有时在加载之前它包含“n/a”。是的。在自定义等待中添加了n/a条件:)
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'), '.'))