Почему selenium не распознает или не может взаимодействовать с элементами рекламы на веб-сайте?

Как решить проблему с Selenium, когда он не может видеть содержимое теневого DOM и как найти первую ссылку внутри конкретного <div>?
Изображение к вопросу
  • 3 октября 2023 г. 8:47
Ответы на вопрос 2
Селениум может не распознавать или не взаимодействовать с элементами рекламы на веб-сайте по нескольким причинам:

1. Рекламные элементы могут быть созданы с использованием JavaScript, который работает в течение определенного времени после загрузки страницы. В этом случае нужно добавить явные ожидания в коде теста, чтобы дать достаточно времени для загрузки рекламы.

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

Что касается проблемы с распознаванием содержимого теневого DOM, это связано с тем, что Selenium имеет ограниченную поддержку теневого DOM. Теневой DOM - это отделенная часть DOM, которая создается веб-компонентами для изоляции стилей и функциональности. Для взаимодействия с содержимым теневого DOM можно использовать расширения или дополнения, такие как ShadowDOM.

Чтобы найти первую ссылку внутри конкретного div, можно использовать методы Selenium для поиска элементов и извлечения текста ссылки. Например, если элемент div имеет идентификатор "myDiv", вы можете использовать следующий код на языке Python:

```python
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")  # замените URL на нужный

my_div = driver.find_element_by_id("myDiv")
link = my_div.find_element_by_tag_name("a")
first_link_text = link.text

print(first_link_text)
```
Таким образом, чтобы кликнуть кнопку внутри закрытого Shadow DOM, можно использовать следующий пример с использованием Selenium и Python:

```python
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import ChromeService
from webdriver_manager.chrome import ChromeDriverManager

# Установка ChromeDriver и создание драйвера
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

try:
    # Подменяем метод attachShadow у элементов
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': """
        Element.prototype._attachShadow = Element.prototype.attachShadow;
        Element.prototype.attachShadow = function () {
            return this._attachShadow( { mode: "open" } );
        };
    """})

    # Загрузка страницы
    driver.get(url="https://podoq.ru")
    sleep(3)

    # Прокрутка страницы
    for _ in range(1, 7):
        driver.execute_script("window.scrollBy(0,document.body.scrollHeight)")
        sleep(1)

    # Поиск элемента с закрытым Shadow DOM
    shadow_host = driver.find_element(By.XPATH, '//footer//div[contains(@id,"yandex_rtb")]/div')

    # Получение всех ссылок внутри Shadow DOM
    shadow_root_a_els = driver.execute_script('return arguments[0].shadowRoot.querySelectorAll("a");', shadow_host)

    # Вывод текста и ссылок
    for shadow_root_a_el in shadow_root_a_els:
        print(f"{shadow_root_a_el.text} {shadow_root_a_el.get_attribute('href')}")

except Exception as e:
    print(e)
    raise
finally:
    driver.quit()
```

Этот пример позволяет получить все ссылки внутри закрытого Shadow DOM на странице "https://podoq.ru".
Похожие вопросы