【问题标题】:Tick a checkbox using Selenium webdriver in Python在 Python 中使用 Selenium webdriver 勾选复选框
【发布时间】:2022-01-11 11:01:43
【问题描述】:

同学们,

我正在做一些网页抓取,需要从 www1.hkexnews.hk 网站下载多个 PDF。

但是,我在尝试让我的 Selenium chromedriver 勾选框时遇到了一个问题,每次人们想在上述网站上下载 PDF 时都会出现该框。代码执行,但该框仍然未单击。

请参考下面我的源代码 - 非常感谢任何建议!

driver = webdriver.Chrome('/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/chromedriver',options=chrome_options)
driver.implicitly_wait(10)
driver.maximize_window()

start_address = "https://www1.hkexnews.hk/app/appyearlyindex.html?lang=en&board=mainBoard&year=2021"

driver.get(start_address)
PDF_link = driver.find_element_by_xpath("//a[contains(text(),'Full Version')]")
print("Now clicking...'", PDF_link.text,"'")
PDF_link.click()

checkbox = driver.find_element_by_id('warning-statement-accept')
print("Now clicking...", checkbox.text)
checkbox.click

编辑:谢谢你们!现在下载工作正常,只是一个小的后续问题 - 我如何修改下载代码以根据其公司名称保存每个 PDF - 可通过all_names = driver.find_elements_by_xpath("//div[@class='applicant-name']")获得?

目前,我正在使用下面的自动下载选项,我想下载逻辑必须进行调整(我宁愿已经下载具有正确名称的 PDF,而不是使用使用 Python 的肮脏解决方法保存后更改名称...)

chrome_options.add_experimental_option('prefs', {
"download.default_directory": "/Users/XXX/Downloads", #Change default directory for downloads
"download.prompt_for_download": False, #To auto download the file
"download.directory_upgrade": True,
"plugins.always_open_pdf_externally": True #It will not show PDF directly in chrome
})

【问题讨论】:

  • 你不是少了括号吗? checkbox.click()
  • 抱歉,当我添加括号时,它返回错误:“消息:元素不可交互”。然而,这个元素显然是可点击的,我可以手动完成——你可以在网站上自己查看。知道如何使用 Selenium 点击它吗?

标签: python html selenium web-scraping xpath


【解决方案1】:

应该这样做:

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

link = "https://www1.hkexnews.hk/app/appyearlyindex.html?lang=en&board=mainBoard&year=2021"

driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)

driver.get(link)
elem = wait.until(EC.presence_of_element_located((By.XPATH,"//tr[@class='record-ap-phip']//a[contains(.,'Full Version')]")))
elem.click()
wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='warning-statement-dialog']//label[@for='warning-statement-accept']"))).click()
wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='warning-statement-dialog']//a[contains(@class,'btn-ok')]"))).click()

这里是脚本的修改版本,它将踢出新打开的标签。我没有在脚本中包含下载逻辑。我想你可以自己做。

driver.get(link)
current = driver.current_window_handle
for elem in wait.until(EC.presence_of_all_elements_located((By.XPATH,"//tr[@class='record-ap-phip']//a[contains(.,'Full Version')]"))):
    elem.click()
    wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='warning-statement-dialog']//label[@for='warning-statement-accept']"))).click()
    wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='warning-statement-dialog']//a[contains(@class,'btn-ok')]"))).click()
    wait.until(EC.new_window_is_opened)
    driver.switch_to.window([window for window in driver.window_handles if window != current][0])
    print(driver.current_url)
    driver.close()
    driver.switch_to.window(current)

driver.quit()

【讨论】:

  • 这成功了!!!太感谢了!附带说明 - 保存此 PDF 后,是否有一种有效的方法可以关闭打开的 PDF 选项卡并开始搜索下一个 a[contains(.,'Full Version')] ?如果我为 1,000 个 PDF 执行此操作,我不想因为打开数百个 PDF 选项卡而导致 Chrome 崩溃...
  • 请查看编辑@gweilo8。
  • 知道了,非常感谢!!对于下载逻辑,我知道如何包含一个简单的逻辑,但是如果我需要使用每个公司的名称保存每个 PDF,即 all_names = driver.find_elements_by_xpath( "//div[@class='applicant-name']")?
【解决方案2】:

这里有几个问题:

  1. “复选框”定位器错误。
  2. 您当前的代码将仅下载第一个 PDF 文件。
    最好使用预期条件显式等待而不是隐式等待。
    这应该会更好:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/chromedriver',options=chrome_options)
wait = WebDriverWait(driver, 20)

driver.maximize_window()

start_address = "https://www1.hkexnews.hk/app/appyearlyindex.html?lang=en&board=mainBoard&year=2021"

driver.get(start_address)
PDF_link = wait.until(EC.visibility_of_element_located((By.XPATH, "//a[contains(text(),'Full Version')]")))

print("Now clicking...'", PDF_link.text,"'")
PDF_link.click()

checkbox = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[./label[@for='warning-statement-accept']]//input")))
print("Now clicking...", checkbox.text)
checkbox.click

【讨论】:

  • 很抱歉,恐怕您提供的代码在执行时没有错误,但仍然没有勾选复选框 .您介意在网站本身上进行测试吗?我需要勾选复选框,然后点击“接受”按钮,然后下载 PDF...
  • 你确定这段代码没有选中复选框吗?之后您仍然需要单击“接受”按钮。
  • 它不 :((( 它在您的浏览器上工作吗?当我运行代码时,复选框保持空白,即使在我物理单击“接受”按钮后,也没有任何反应。因此,复选框显然没有被点击。
  • 不幸的是,我的 PC 上没有 Selenium 和 Python。请查看更新后的 xpath 是否适合您
猜你喜欢
  • 2016-01-02
  • 2017-06-09
  • 2020-09-10
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2011-11-28
相关资源
最近更新 更多