нему собственный метод?
Я отказался от варианта добавить метод в исходники, т.к. при переустановке он не сохранится.
Сейчас я делаю так:
1) Создал файл classes2) Импортировал в файл classes модуль selenium3) Создал класс в файле classes унаследовав его от selenium4) Добавил свой метод в созданный класс
5) импортировал файл classes в основной файл main, используя везде его вместо оригинального модуля
Правильной ли стратегии я придерживаюсь?
Вполне правильно)
А нужно init прописывать или super ?
super().__init__()
Только есть одна фишка, которую нужно соблюсти. Следует наследовать какой-то конкретный класс (Chrome, Firefox и тд), а не webdriver
И еще в super().init() желательно подать аргументы, для хрома, хромдрайвера и тд
Т.е. весь код выглядит так?: код класса: class webdriver_with_my_class(webdriver.Firefox): def __init__(self, delay=3, located_by=None, elem_name=None, find_all=False): super().__init__() self.delay = delay self.located_by = located_by self.elem_name = elem_name self.find_all = find_all def wait_find(self): WebDriverWait(self, self.delay).until( EC.presence_of_element_located((self.located_by, self.elem_name))) return self.find_elements(self.located_by, self.elem_name) if self.find_all else self.find_element( self.located_by, self.elem_name) код создания драйвера from classes import webdriver_with_my_class driver = webdriver_with_my_class.Firefox(executable_path='geckodriver')
если родительскому конструктору ничего передавать не надо, то да, примерно так
Почти, еще нужно передать в super().init() аргументы, которые были в классе webdriver.Firefox, Вот init() класса Firefox: def __init__(self, firefox_profile=None, firefox_binary=None, timeout=30, capabilities=None, proxy=None, executable_path="geckodriver", options=None, service_log_path="geckodriver.log", firefox_options=None, service_args=None, desired_capabilities=None, log_path=None, keep_alive=True):
если что-то из self.<что-то там> = <что-то там> трогает что-то из родительского, то лучше это сделать через передачу аргументов родительскому конструктору или вызов родительских функций, что есть из возможного
Про *args и **kwargs знаете?
А можно просто webdriver наследовать? Иначе параметров уйму передавать нужно. Плюс получается относительно неявное создание драйвера. Я хочу сделать свой метод равнозначным методу find_by_id например, т.е. на 1-м уровне, 1-ой вложенности и т.п. В исходниках же не создается драйвер для создания метода find_by_id (как я понимаю)
Точно не знаю, но скорее всего нет, тк у этих классов разные конструкторы.
Без костылей не получится)
Возникла неожиданная проблема, как мне создавать драйвер нормальным способом, а не новым новый: driver = webdriver_with_my_class(executable_path='geckodriver')Нормальный: driver = webdriver.Firefox(executable_path='geckodriver') # Firefox
Обсуждают сегодня