Как вы нажимаете кнопку расширения в Python с помощью селена?

#python #python-3.x #selenium

Вопрос:

Я работаю над сценарием для selenium, чтобы открыть веб-страницу и нажать ряд кнопок. Первая кнопка-это кнопка расширения, показанная на рисунке ниже

Кнопка Развернуть

HTML-код от проверки кнопки приведен ниже, но сама кнопка «class=»dojoxExpandoIcon dojoxExpandoIconLeft qa-кнопка-toc»

 <div class="dojoExpandoPaneInner">
        <div data-dojo-attach-point="titleWrapper" class="dojoxExpandoTitle">
            <div class="dojoxExpandoContainer">
                <div class="dojoxExpandoIcon dojoxExpandoIconLeft qa-button-toc" data-dojo-attach-point="iconNode" data-dojo-attach-event="ondijitclick:_onIconNodeClick" tabindex="0" aria-controls="slideout"><span class="a11yNode">X</span></div>
            </div>
 

Xpath также выглядит следующим образом:

 /html[@class='dj_webkit dj_chrome dj_contentbox has-webkit has-no-quirks svg']/body[@class='claro original']/div[@id='border']/div[@id='slideout']/div[@class='dojoExpandoPaneInner']/div[@class='dojoxExpandoTitle']/div[@class='dojoxExpandoContainer']/div[@class='dojoxExpandoIcon dojoxExpandoIconLeft qa-button-toc']
 

Чтобы найти эту кнопку, я попробовал следующий код по одному за раз.

 driver.find_element_by_css_selector("div[class^='dojoxExpandoIcon']")    # find expander by class name
# driver.find_element_by_css_selector("div[class^='dojoxExpandoIcon dojoxExpandoIconLeft qa-button-toc']")    # find expander by class name
# driver.find_element_by_css_selector("div.dojoxExpandoContainer")
 

Однако ни один из них вообще не работал и приводил к таким ошибкам, как

 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"div.dojoxExpandoIcon.dojoxExpandoIconLeft.qa-button-toc"}
 

Есть ли что-то, что я здесь делаю не так?

Комментарии:

1. есть ли какой-нибудь iframe ? пожалуйста, проверьте

2. @cruisepandey нет iframe. Я добавил полный xpath раскрывающегося списка на странице, если это поможет.

Ответ №1:

Попробуйте подождать, пока локатор не станет доступным для кликабельности:

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 15)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".dojoxExpandoIcon.dojoxExpandoIconLeft.qa-button-toc")))
button = driver.find_element_by_css_selector(".dojoxExpandoIcon.dojoxExpandoIconLeft.qa-button-toc").click()
 

Если количество классов не является стабильным, удалите те, которые меняются, и оставьте только стабильные, например:

 .dojoxExpandoIconLeft.qa-button-toc
 

Здесь я только что удалил один из классов.

Подробнее об этом читайте здесь https://selenium-python.readthedocs.io/waits.html.

Комментарии:

1. Отличается ли этот подход от использования time.sleep? Обычно я даю веб-странице не менее 30 секунд на открытие с помощью time.sleep(30), который в основном приостанавливается перед выполнением следующего шага в коде.

2. Это совсем другое. Он ждет, пока элемент не будет найден, и сразу после того, как он найден, на него нажимают. Таким образом, это в основном экономит ваше время, экономически эффективно. Обычно загрузка страницы занимает 30 секунд, затем измените время ожидания от 15 до 30 секунд.

3. Нет. Это не сработало. Я получил тайм-аут исключения трассировки стека из-за того, что он не смог найти элемент. Я в тупике. HTML — код там есть…. Есть ли какой-нибудь способ сделать это с помощью x_path вместо CSS? Я ввел полный xpath в свой код.

4. Хорошо, поставьте полный html-код лучше.