Изменить стиль с селеном python - PullRequest
0 голосов
/ 17 января 2020

на этом сайте Я пытаюсь установить некоторые фильтры для сбора данных, но не могу получить доступ к таблице, используя событие щелчка с селеном в моем скрипте python. Я заметил, что мне нужно изменить стиль с:

div id="filtersWrapper" class="displayNone " style="display: none;"

на

div id="filtersWrapper" class="displayNone " style="display: block;"

Я думаю, что я должен использовать driver.execute_script(), но я понятия не имею, как это сделать

Буду очень признателен за помощь. Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 января 2020

Вы можете использовать driver.execute_script() для выполнения sh этого. Вот как я изменяю атрибут style в своем собственном коде:

div_to_change = driver.find_element_by_id("filtersWrapper")
driver.execute_script("arguments[0].style.display = 'block';", div_to_change)

Я посмотрел на веб-сайт, который вы автоматизируете, и вам вообще может не понадобиться использовать JSE для этого - есть причина div, которую вы пытаетесь щелкнуть, имеет style = "display: none" - она ​​не предназначена для нажатия в этом контексте. Обход этого с Javascript может не дать ожидаемых результатов. Этот фрагмент кода был обновлен в соответствии с вашими требованиями для установки фильтра времени в разделе календаря Economi c:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver.get("https://www.investing.com/economic-calendar/")

driver.find_element_by_id("economicCurrentTime").click()

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "filterStateAnchor"))).click()

checkbox_for_bull3 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='importance2']")))
driver.execute_script("arguments[0].scrollIntoView(true);", checkbox_for_bull3)
checkbox_for_bull3.click()

checkbox_for_time = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//fieldset[label[@for='timeFiltertimeOnly']]/input")))
checkbox_for_time.click()

Я изменил ваш фрагмент кода, чтобы устранить некоторые проблемы - при переходе к economic-calendar страница, вы дважды щелкали по полю «Фильтры», что вызывало проблему при попытке нажать checkbox_for_bull3. Я также добавил вызов scrollIntoView() Javascript.

Я выполнил это на своем локальном компьютере, и код успешно завершился.

0 голосов
/ 17 января 2020

Я проверил Дерево DOM веб-страницы . Каким-то образом мне не удалось найти какой-либо элемент как:

<div id="filtersWrapper" class="displayNone " style="display: none;">

Однако существует следующий элемент:

<div id="filtersWrapper" class="displayNone ">
        <div id="filtersArrowIndicator" class="arrowIndicator"></div>
    .
    <div id="economicCalendarSearchPopupResults" class="eventSearchPopupResults economicCalendarSearchPopupResults text_align_lang_base_1 dirSearchResults calendarFilterSearchResults displayNone">
    </div>
</div>

Не уверен, что это был ваш желаемый элемент. Немного больше информации о вашем сценарии использования помогло бы нам отладить проблему лучше. Однако, чтобы установить свойство display атрибута style как block для элемента, который вы можете использовать:

driver.execute_script("document.getElementById('filtersWrapper').style.display='block';");
0 голосов
/ 17 января 2020

Вы можете изменить атрибут элемента с помощью javascript через селен

element = driver.find_element_by_id('filtersWrapper')
driver.execute_script("arguments[0].setAttribute('attributeToChange', 'new value')", element)

или попробуйте щелкнуть элемент с помощью javascript

driver.execute_script("arguments[0].click();", element)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...