t.me/atinfo_chat Telegram группа по автоматизации тестирования

Python/selenium попытка написать свой selenide

Теги: #<Tag:0x00007f748baf8640> #<Tag:0x00007f748baf84b0> #<Tag:0x00007f748baf8320> #<Tag:0x00007f748baf8168>

Подскажите пожалуйста начинающему джуниору, писал раньше тесты на selenide, сменил работу и теперь приходится осваивать python.
Нашел кусок видео-курсов Якова “Selenide на python”, попробовал повторить, но тест даже не запускается.
Я уверен, что все сделал неправильно) и любой питонист и без логов поймет, что тут не так.
Но если надо то я конечно же добавлю.

from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Firefox()

class WaitingElement(object):
    def __init__(self, css_selector):
        self._locator = css_selector

    def _finder(self):
        return browser.find_element_by_css_selector(self._locator)

    def __getattr__(self, item):
        WebDriverWait(browser, 4).until(visible(self._finder))
        return getattr(self.finder(), item)

    def check(self, condition, *args):
        WebDriverWait(browser, 4).until(condition(self._finder(), *args))
        return self

def x(cssSelector):
    return WaitingElement(cssSelector)


class text(object):
    def __init__(self, finder, text_):
        self.locator = finder
        self.text = text_

    def __call__(self, driver,):
        try:
            element_text = self.finder().text
            return self.text in element_text
        except StaleElementReferenceException:
            return False


class visible(object):
    def __init__(self, finder):
        self.finder = finder

    def __call__(self, driver):
        try:
            return self.finder().is_displayed()
        except StaleElementReferenceException:
            return False

browser.get("https://www.google.ru/")
x("#lst-ib").send_keys("google", Keys.ENTER)

Во-первых, код в посте нечитаемый. Нужно нормально отформатировать, тем более для питона.

Во-вторых, что должен делать тест? Зачем нужны все эти классы?

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

Если хотите использовать selene, по умолчанию вообще не надо импортировать selenium. Начните с простого примера, вот отсюда:

Спасибо за совет, но к сожалению нужно написать свой, очень примитивный аналог selene.
Класс text и visible - это измененный селениумовские классы.
text нужен для такого рода проверок:
x(“css_locator”).assure(text, наличие текста)

Но основная цель реализовать своими силами умный искатель элементов, такой как $ в Selenide и S в Selene.

Selene - полный аналог, готовый для использования в продакшине

1 Симпатия

Я знаю, это очень хорошая вещь.
Но мне нужно лишь реализовать аналог умного искателя элементов как в нем.
Буду очень признателен если сможете помочь.

Дело в том, что реализация умного искателя требует всего остального. Чем обусловлена нужда писать свое? Может легче контрибютить в selene?

1 Симпатия

Тогда прошу прощения, не так понял смысл задания.

Там рекурсия из-за того, что self.finder() заново вызывает __getattr__. Надо поправить на self._finder().

Еще в классе text инициализируете self.locator, а вызываете потом finder.

@Sergey_Pirogov: возможно, нет цели изобретать велосипед, просто задание так стоит.

1 Симпатия

Спасибо большое, изменил и действительно все заработало)
Но теперь есть еще одна проблема, этот прокси элемент “x” не работает со стандартным селениумовским кликом. Вернее он сам думает, что нажимает на элемент но на самом деле этого не происходит.

Приписал такой экшен, но все равно он не хочет кликать

def clicker(self):
ActionChains(browser).click(self).perform()
return self

В новых FF экшены не работают, на форуме должны быть темы про это.