Каков наиболее эффективный способ проверить, существует ли элемент в 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 ответ

Решение вашей проблемы:


Вывод

конкретная страница иногда зависала бы бесконечно , было бы относительно легче обратиться. Однако в обход

      document.readyState == interactive

и в пользу:

      capa["pageLoadStrategy"] = "none"

и настройка Selenium WebDriver так , чтобы он не ждал полной загрузки dom, — это не только компромисс в производительности, но и барьер, при котором вы вынуждены использовать presence_of_element_located()вместо visibility_of_element_located()и вызвать хаос и нестабильность.

Другие вопросы по тегам