Каков наиболее эффективный способ проверить, существует ли элемент в Selenium
Контекст: я имею в виду многопоточность нескольких экземпляров браузеров и выполнение процессов в них.
Причина вопроса: я хотел бы знать, что является наиболее эффективным/менее затратным способом проверки элемента в селене python. Я попробовал два метода, которые я покажу ниже, и немного разобрался в каждом из них.
Во-первых, это моя функция, которая возвращает экземпляр драйвера:
def open_driver():
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.default_conte nt_setting_values.notifications" : 2}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_argument("start-maximized")
chrome_options.add_argument('ignore-certificate-errors')
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome, desired_capabilities=capa)
return driver
Обратите внимание на эту конкретную строку:
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
Насколько я понимаю, это скажет селену не ждать, пока дом полностью загрузится. Это компромисс производительности, который мне пришлось выбрать, потому что эта конкретная страница иногда бесконечно зависала в
document.readyState == interactive
Итак, у меня есть в основном два варианта, о которых я знаю, при проверке существования элемента (я также был бы признателен за предложения), а именно:
который возвращает WebElement. Две вещи об этой линии: Я думаю, что это не уважение
время из-за но я не уверен Он очень нестабилен, иногда работает быстро, иногда очень медленно.
driver.execute_script("document.getElementsByClassName('alert alert-danger ng-binding ng-scope')[0].innerText")
Это внутри
Сказав это и повторив, что я новичок в этом, я благодарю вас за то, что уделили время чтению моего вопроса.
PS: Жду предложений, улучшений и особенно исправлений.
1 ответ
Решение вашей проблемы:
- С использованием
capa["pageLoadStrategy"] = "none"
настроить Selenium так, чтобы он не ждал полной загрузки dom, это не будет ограничиваться только компромиссом в производительности, но также повлияет на стабильность ваших тестов, поскольку в дальнейшем вам необходимо идентифицировать WebElement в зависимости от их наличия , видимости и кликабельности. - Если ваш вариант использования включает возврат WebElement, вместо присутствия_of_element_located() вам нужно использовать visible_of_element_located() для оптимальной стабильности.
Вывод
конкретная страница иногда зависала бы бесконечно , было бы относительно легче обратиться. Однако в обход
document.readyState == interactive
и в пользу:
capa["pageLoadStrategy"] = "none"
и настройка Selenium WebDriver так , чтобы он не ждал полной загрузки dom, — это не только компромисс в производительности, но и барьер, при котором вы вынуждены использовать
presence_of_element_located()
вместо
visibility_of_element_located()
и вызвать хаос и нестабильность.