python selenium复选框嵌套标签和输入

2024-09-29 19:24:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在美联储的文件过滤页面上用selenium在“分钟(1993年至今)”上打勾

https://www.federalreserve.gov/monetarypolicy/materials/

这是我的密码。我尝试了以下方法,我一直得到“消息:没有这样的元素:找不到元素:找不到元素”

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time

PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

driver.get("https://www.federalreserve.gov/monetarypolicy/materials/")

link = driver.find_element_by_xpath('//*[@id="article"]/app-root/div/ng-component/div[1]/div/div/form/app-doc-types/div[2]/div/div/div[7]/label/input').click()
link = driver.find_element_by_xpath("//div[@class='form-group']/div/div[7]/label/input[contains(text(), 'Minutes (1993-Present)')]").click()
link = driver.find_element_by_css_selector('div.form-group div:nth-child(7) label input').click()

我把下面HTML的一些部分切掉了

<app-doc-types><div class="eventSearch__label">
  <p class="form-control-static">
    <strong><legend class="ng-binding">Type:</legend></strong>
  </p>
</div>
<div class="eventSearch__inputs">
  <div class="form-group">
    <div class="row">
      <div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-untouched ng-pristine ng-valid">
          Agendas
        </label>
      </div><div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-untouched ng-pristine ng-valid">
          Beige Books/Redbooks
        </label>
      </div><div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-untouched ng-pristine ng-valid">
          Bluebooks
        </label>
      </div><div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-untouched ng-pristine ng-valid">
          Chairman's FOMC Press Conferences
        </label>
      </div><div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-untouched ng-pristine ng-valid">
          Greenbooks
        </label>
      </div><div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-untouched ng-pristine ng-valid">
          Memos
        </label>
      </div><div class="col-lg-6">
        <label>
          <input type="checkbox" class="ng-valid ng-dirty ng-touched">
          Minutes (1993-Present)
        </label>
      </div><!---->
    </div>
  </div>
</div>


</app-doc-types>

Tags: fromimportdivinputtypeseleniumcolng
2条回答

网站加载需要一些时间。在用driver打开网页后,我添加了time.sleep(2)
您的第一个XPath应该可以工作,但是它非常依赖于页面的结构,因此由于对页面的HTML结构进行了一些修改,它可能无法工作
第二个XPath不起作用,实际上您不需要在路径的末尾添加text()检查。这应该有效:
//div[@class='form-group']/div/div[7]/label/input
CSS选择器路径应该可以工作,但是您的CSS路径可以轻松简化。请在下面检查我的解决方案:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time

driver = webdriver.Chrome()

driver.get("https://www.federalreserve.gov/monetarypolicy/materials/")
time.sleep(2)
link = driver.find_element_by_css_selector('.col-lg-6:nth-of-type(7) input').click()

或者,您可以使用explicit wait

driver.get("https://www.federalreserve.gov/monetarypolicy/materials/")
element = WebDriverWait(driver , 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR , '.col-lg-6:nth-of-type(7) input')))
element.click()

你可以用剧作家

import asyncio
from playwright.async_api import async_playwright

async def run(playwright):
    chromium = playwright.chromium # or "firefox" or "webkit".
    browser = await chromium.launch()
    page = await browser.new_page()
    await page.goto("https://www.federalreserve.gov/monetarypolicy/materials/")
    await page.click('xpath=/html/body/div[3]/div[2]/div[2]/app-root/div/ng-component/div[1]/div/div/form/app-doc-types/div[2]/div/div/div[7]/label/input')
    await browser.close()
    
async def main():
    async with async_playwright() as playwright:
        await run(playwright)
asyncio.run(main())

相关问题 更多 >

    热门问题