Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

При запуске автотеста (python+selenium) нарушается последовательность действий и при выборе города перезагружается страница.


(Misha Polunin) #1

Последовательность действий.

  1. Открываю в chrome сайт hotline.ua
  2. Выбираю город Днепр
  3. В поисковой строке ввожу “iphone”
  4. Кликнуть поиск.

Фактический результат: открывается страница hotline.ua, пока автотест открывает окно с выбором города, строка поиска заполняется быстрее чем выбор города. После выбора города страница перезагружается, и поисковая строка возвращается в исходное состояние.

Ожидаемый результат: открывается страница hotline, выбираем город Днепр, заполняется строка поиска, кликается поиск.

Код:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
driver.set_window_size(1920,1080)
driver.get(“http://www.hotline.ua”)
driver.manageelement = driver.find_element_by_xpath("//span[@class=‘link inline m_b-md cell-xs’]").click()
driver.implicitly_wait(5)
element = driver.find_element_by_xpath("//a[contains(text(),‘Днепр’)]").click()
driver.implicitly_wait(5)
elenment = driver.find_element_by_xpath("//input[@id=‘searchbox’]").send_keys(‘iphone’)
elenment = driver.find_element_by_xpath("//input[@id=‘doSearch’]").click()


(Maxim Andryushchenkov) #2

Зачем?

Зачем импортить если не используете?

Это надо (но не желательно пользоваться этим от слова совсем) устанавливать один раз

Запустил у себя и понял что вы не ждете явно всплывающего окна с городами. Используйте WebDriverWait класс в сочетании с expected_conditions классом чтобы удостовериться в появлении окна с выбором города. Потом уже выбирайте город и продолжайте тест.
Можете вот так реализовать:

    from selenium.webdriver.support.ui import WebDriverWait as WDWait
    from selenium.webdriver.support import expected_conditions as EC

    def wait_and_get_element(self, element: str, timeout=15, loc_type='xpath', by_locator=False):
        locator = element if by_locator else self.locators[element]
        timeout = self.waiting_timeout if self.waiting_timeout else timeout
        WDWait(self.driver, timeout).until(
            EC.presence_of_element_located((loc_type, locator))
        )
        return self.driver.find_element(loc_type, locator)

Вот вам еще на будущее, поможет в ожидании чего либо:

def wait_for(condition, timeout=300, interval=5, error_message=None):
    """
    Функция ожидает пока condition не станет True, иначе кидает исключение по таймауту
    :param condition: какая-либо лямбда, выполняется в теле цикла
    :param timeout: максимально допустимое время ожидания (сек)
    :param interval: интервал проверок (сек)
    :param error_message: сообщение об ошибке, если требуется
    """
    raise_time = int(time() + timeout)
    while int(time()) < raise_time:
        if condition():
            return
        sleep(interval)
    raise TimeoutError(error_message)