Selenium: подождите, пока элемент empy (span) не будет содержать текст - PullRequest
0 голосов
/ 23 октября 2018

Итак, у меня есть проблема, связанная с медленной загрузкой данных, которая отключает мой Selenium.

Сама страница завершает загрузку, но у меня затем появляются данные с произвольным интервалом (выполняются сценарии, которые могут занять Xколичество времени) в указанном промежутке.Он может отображаться как пустой или со строкой «n / a».

Примечание: класс chart-data-window-item-value-НЕ является уникальным, и я должен использовать XPATH, чтобы найти правильный div / 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]*)"))

Не повезло.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Я думаю, вы делаете это более сложным, чем нужно.Если вы посмотрите на документы для 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'), '.'))

В вашем коде использовалось регулярное выражение (я думаю) ... этот метод не принимает регулярные выражения и, вероятно, просто обработал его как фактическую строку.

0 голосов
/ 23 октября 2018

Попробуйте использовать пользовательское ожидаемое условие, чтобы проверить, что диапазон содержит правильный текст вместо регулярного выражения.

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 для long, пожалуйста, проверьте, является ли он уникальным.Добавьте подробности html к вопросу, чтобы помочь вам для краткого и ясного xpath.

...