Сбой ожидания Selenium на BrowserStack - PullRequest
0 голосов
/ 03 августа 2020

У нас есть автоматизированный тест пользовательского интерфейса, запущенный с BrowserStack, и он не запускается постоянно, время от времени истекает время ожидания добавления элементов в DOM, но при локальном запуске с Chromedriver тест проходит успешно в 100% случаев.

Вот пример неудачного ожидания селена:

return WebDriverWait(self.__driver, 10).until(
    ec.presence_of_element_located((By.XPATH, locator))
)

Кто-нибудь еще видел подобное несоответствие с BrowserStack и знает, что может его вызывать, и есть ли лучший способ подождать элемент, который станет доступным.

Точное исключение, которое мы получаем: TimeoutException от ec.presence_of_element_located((By.XPATH, locator)).

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

availability_of_element_located ()

presence_of_element_located() - это ожидание для проверки наличия элемента в DOM страницы. Это не обязательно означает, что элемент виден. Следовательно, ожидание появления самого первого сопоставленного WebElement .

Generi c варианты использования

Как правило, в ваших тестах простое ожидание наличия элемента может не соответствовать вашим требованиям, и вам может потребоваться дождаться, пока элемент будет видимый или интерактивный .

Чтобы дождаться, пока элемент станет видимым, вам нужно вызвать WebDriverWait для visibility_of_element_located () и ваш эффективный блок кода будет:

return WebDriverWait(self.__driver, 10).until(
    ec.visibility_of_element_located((By.XPATH, locator))
)

Чтобы дождаться, пока элемент станет доступным для взаимодействия, вам нужно вызвать WebDriverWait для element_to_be_clickable () и вашего эффективный блок кода будет:

return WebDriverWait(self.__driver, 10).until(
    ec.element_to_be_clickable((By.XPATH, locator))
)

Примечание : необходимо добавить следующие импорты:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec

Этот вариант использования

В этом варианте использования строка:

ec.presence_of_element_located((By.XPATH, locator))

не смогла идентифицировать желаемый элемент в течение желаемого периода времени, поэтому вы столкнулись с TimeoutException .

Однако из TimeoutException будет сложно определить фактический результат сбоя.

Решение

В качестве решения, чтобы узнать точную причину сбоя, вам необходимо удалить WebDriverWait и заменить строку кода на:

  • find_element_by_class_name(name)
  • find_element_by_css_selector(css_selector)
  • find_element_by_id(id)
  • find_element_by_link_text(link_text)
  • find_element_by_name(name)
  • find_element_by_partial_link_text(partial_link_text)
  • find_element_by_tag_name(tag_name)
  • find_element_by_xpath(xpath)

При необходимости вы можете замедлить поиск, вызывая ожидание через time.sleep(secs) во время отладки .

Ссылки

Вы можете найти пару соответствующих обсуждений в:

0 голосов
/ 04 августа 2020

Эта проблема устранена. По какой-то причине переключение OS BrowserStack на OS X решило ошибку. Локальные тесты с chrome -драйвером работают для обеих операционных систем, но наш тест BrowserStack стабильно работает только на Ma c, причем Windows дает сбой примерно в половине случаев. Мы все еще работаем, чтобы понять, почему именно это так, но в настоящее время это исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...