用硒蟒改变风格



在这个网站上,我尝试设置一些过滤器来收集数据,但我无法使用 python 脚本中带有硒的点击事件访问该表。 我注意到我需要将样式从:

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

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

我认为我应该使用driver.execute_script(),但我不知道该怎么做

我将非常感谢对此的一些帮助。谢谢!

您可以通过 selenium 使用 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)

我已经检查了网页的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>

不确定这是否是您想要的元素。有关您的用例的更多信息将帮助我们以更好的方式调试问题。但是,要将 style 属性的display属性设置为元素的block,您可以使用:

driver.execute_script("document.getElementById('filtersWrapper').style.display='block';");

您可以使用driver.execute_script()来完成此操作。这是我在自己的代码中更改style属性的方式:

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

我看了一下您正在自动化的网站,您可能根本不需要使用 JSE 来执行此操作 - 您尝试单击divstyle = "display: none"是有原因的 - 它并不意味着在这种情况下被点击。使用 Javascript 解决这个问题可能不会产生你预期的结果。此代码片段已根据您的要求进行了更新,以便在"经济日历"部分中设置时间筛选器:

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 调用。

我在本地计算机上运行了它,并且代码端到端执行成功。

最新更新