【问题标题】:An efficient way of checking boxes using selenium使用硒检查框的有效方法
【发布时间】:2018-06-11 19:52:24
【问题描述】:

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

默认the buttons look like this

当我选择所需的字段时,他们look like this

我怎样才能有效地做到这一点?

【问题讨论】:

  • 嗯,这取决于您所说的高效。如果您想单击每个单独的按钮,则您的解决方案在执行时间方面的效率几乎是一样的。如果您希望代码更整洁,您可以制作一个需要单击的 css 选择器列表并循环遍历它。如果您希望代码更快,只需直接从数据库页面的源代码中获取 JSON,然后使用 json 库从那里过滤。
  • 是的,n1c9,你是对的。我打算使用循环做同样的事情,但找不到这样做的想法。至于 json 链接,我找不到使用开发工具的链接。但是,我检查了源代码,但也找不到它。不过,它应该在那里。
  • 它在一个名为 projects 的变量中,就在 <link rel="shortcut icon" href="//urbantoronto.ca/sites/all/themes/urbane/favicon.ico" /></script> 位之后。我试图将其复制并粘贴到 pastebucket 但它太大了。
  • 哦,我明白了!我已经遇到过,但是没有链接到那个项目导致 json 的东西。
  • 该项目变量的内容 JSON - 它都是直接从页面加载的,而不是从外部源加载的。如果它来自外部来源,通常查看网络选项卡并过滤 XHR 请求有助于揭开它的神秘面纱。

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

仍然不确定您所说的“高效方式”是什么意思

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

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

【讨论】:

  • 是的,这就是我想要做的。再次感谢先生。我可能需要发布另一个与此相关的问题。我在抓取单个链接时遇到过时元素问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2014-02-02
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多