【问题标题】:Change style with selenium python用 selenium python 改变风格
【发布时间】:2020-01-18 00:44:31
【问题描述】:

this website 上,我尝试设置一些过滤器来收集数据,但我无法在 python 脚本中使用带有 selenium 的单击事件访问表。 我注意到我需要更改样式:

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

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

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

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

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我已经检查了webpageDOM Tree。不知何故,我无法找到任何元素:

      <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';");
      

      【讨论】:

        【解决方案3】:

        您可以使用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 解决这个问题可能不会产生您想要的结果。此代码 sn-p 已根据您在经济日历部分设置时间过滤器的要求进行了更新:

        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()
        

        我修改了您的代码 sn-p 以解决一些问题 - 在导航到 economic-calendar 页面时,您点击了两次“过滤器”字段,导致尝试点击 checkbox_for_bull3 时出现问题。我还添加了一个scrollIntoView() Javascript 调用。

        我在本地机器上运行了这个,代码端到端成功执行。

        【讨论】:

        • 我尝试使用你的脚本作为模板,但我仍然有一些问题,我在答案中发布了我的脚本
        • @Haze 使用您的代码查看更新的解决方案和我的 cmets。新解决方案已在我端成功执行。
        猜你喜欢
        • 2018-03-28
        • 2012-08-11
        • 2019-05-08
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多