Python 使用selenium检查复选框的有效方法

Python 使用selenium检查复选框的有效方法,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我已经用python和selenium编写了一个脚本,用于打开连接到三个按钮中两个按钮的两个框。然后在这两个框中,几乎没有要选中或取消选中选项的字段 使用下面的脚本,我可以选中所需的框连接到前两个按钮,但问题是我的方式整个操作非常不整洁。我怎样才能有效地做这件事 我尝试过的脚本: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui

我已经用python和selenium编写了一个脚本,用于打开连接到三个按钮中两个按钮的两个框。然后在这两个框中,几乎没有要选中或取消选中选项的字段

使用下面的脚本,我可以选中所需的框连接到前两个按钮,但问题是我的方式整个操作非常不整洁。我怎样才能有效地做这件事

我尝试过的脚本:

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 = webdriver.Chrome()
driver.get("http://urbantoronto.ca/database/")
wait = WebDriverWait(driver, 10)

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#filter_status_arrow"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_pre_construction"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_complete"))).click()

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#filter_project_type_arrow"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_condo"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_co_op"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#check_house"))).click()

driver.quit()
默认情况下

当我选择所需的字段时,它们将被删除


我怎样才能有效地做这件事?

仍然不知道你所说的“有效方式”是什么意思

尝试以下解决方案,如果需要改进,请告诉我:

driver.get("http://urbantoronto.ca/database/")

# Use @id of filter as key, @ids of check-box as values
filters = {"filter_status": ["pre_construction", "under_construction", "complete"],
           "filter_project_type": ["condo", "hotel", "institutional"]}

for filter_item in filters:
    driver.find_element_by_id("%s_arrow" % filter_item).click()
    for checkbox in filters[filter_item]:
        driver.find_element_by_id(filter_item).find_element_by_id("check_%s" % checkbox).click()

这取决于你所说的效率。如果您想单击每个单独的按钮,您的解决方案在执行时间方面的效率与它得到的一样高。如果你想让代码更整洁,你可以列一个需要点击的css选择器列表,然后循环浏览。如果您希望代码更快,只需直接从数据库页面的源代码中获取JSON,然后使用
JSON
库从那里进行过滤。是的n1c9,您是对的。我本想用循环做同样的事情,但找不到这样做的想法。至于json链接,我无法使用开发工具找到。然而,我检查了源代码,但也没有发现它。但是,它应该在那里。它位于名为
projects
的变量中,就在
位之后。我试图复制并粘贴到pastebucket,但它太大了。哦,我明白了!!我已经遇到过这个问题,但是没有连接到该项目的链接指向json内容。该项目变量的内容是json-它都是从页面加载的,而不是从外部源加载的。如果它来自外部源,通常查看网络选项卡并过滤XHR请求有助于消除神秘感。是的,这就是我试图做的。再次谢谢,先生。我可能需要发布另一个与此相关的问题。在抓取单个链接时,我面临过时的元素问题。