python - Selenium WebDriver 可以单击下拉菜单中的所有组合吗

标签 python selenium selenium-webdriver

所以基本上我需要从 UCLA 书店网站获取部门、类(class)和部分的所有组合:http://shop.uclastore.com/courselistbuilder.aspx然后我需要选择书籍并解析生成的 html 页面。

我没有手动执行此操作(这将花费很长时间),而是寻找其他选项以编程方式执行此操作。我发现的一个选项是 Selenium WebDriver,它处理浏览器自动化。查看 SO 中的示例,我发现 Selenium WebDriver 是一个很有前途的功能,但我不太确定它是否能够完成我需要的功能。

或多或少采用伪代码格式,这是我如何使用 selenium Web 驱动程序的方法

go to the site: http://shop.uclastore.com/courselistbuilder.aspx

for each_department in department:
    click on each_department
    for each_course in course:
        click on each_course
            for each_section in section:
                click on each_section
// After every department, course, and section has been chosen, we click choose books
click on choose books link

// Save the resulting html file
save next page as html file

我想知道我是否能够使用 Selenium WebDriver 做我想做的事情。如果有人可以提供更好的伪代码,将其与 Selenium WebDriver 更合适地结合在一起,那将会很有帮助,但我主要关注的是这个功能是否可行。我还想提一下,我计划在使用 Selenium 时使用 Python API。

最佳答案

您应该从这里开始(解释如下):

from selenium import webdriver
import time
from selenium.webdriver.support.select import Select


url = "http://shop.uclastore.com/courselistbuilder.aspx"

driver = webdriver.Firefox()
driver.get(url)
time.sleep(1)

departments = Select(driver.find_element_by_id('clDeptSelectBox'))
for department in departments.options:
    # select department
    departments.select_by_value(department.get_attribute('value'))
    time.sleep(1)

    cources = Select(driver.find_element_by_id('clCourseSelectBox'))
    for cource in cources.options:
        # select course
        cources.select_by_value(cource.get_attribute('value'))
        time.sleep(1)

        sections = Select(driver.find_element_by_id('clSectionSelectBox'))
        for section in sections.options:
            print {'department': department.text,
                   'course': cource.text,
                   'section': section.text}

driver.close()

打印:

{'department': u'AFRCST - AFRICAN STUDIES', 'course': u'201A', 'section': u'1 - LYDON'}
{'department': u'AFRKLA - AFRICAN LANGUAGES', 'course': u'1A', 'section': u'1 - TA'}
{'department': u'AFRKLA - AFRICAN LANGUAGES', 'course': u'150A', 'section': u'1 - FANTA, A.A.'}
{'department': u'AFROAM - AFRO-AMERICAN STUDIES', 'course': u'6', 'section': u'1 - STREETER, C.A.'}
{'department': u'AFROAM - AFRO-AMERICAN STUDIES', 'course': u'M10A', 'section': u'1 - LYDON, G.E.'}
{'department': u'AFROAM - AFRO-AMERICAN STUDIES', 'course': u'M102', 'section': u'1 - LEWIS, L.I.'}
{'department': u'AFROAM - AFRO-AMERICAN STUDIES', 'course': u'M103A', 'section': u'1 - PRICE, Z.F.'}
{'department': u'AFROAM - AFRO-AMERICAN STUDIES', 'course': u'M104A', 'section': u'1 - YARBOROUGH'}
...

这个想法是广泛使用 Select class它提供了一个很好的 API:select/options 功能。首先,我们获取所有部门,然后迭代选项并选择循环中的下一个部门。然后,在短暂的延迟之后,我们以相同的方式获取类(class)部分列表。

我为您留下了更好的处理 Waits 的方法(time.sleep() 确实不太可靠),然后单击Choose Books 按钮(嗯,German Petrov 为您提供了两者)。

希望有帮助。

关于python - Selenium WebDriver 可以单击下拉菜单中的所有组合吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747294/

相关文章:

python - QTableView 的 QItemDelegate 编辑器上的自定义小部件

docker - Selenium 与 behat : Unable to find provider for session

excel - 在 Excel 2019 上运行 Selenium VBA 时出现自动化错误

python - 如何通过子标签中的文本定位标签

python - 使用 Selenium Webdriver 和 FireFox 时出错

scala selenium dsl 页面对象

Python - 使类装饰器在派生类上工作

python - Numpy:检查 float 组是否包含整数

python - 合并 pandas groupby 中的两个列表并应用

java - 让 Selenium 暂停 X 秒