【问题标题】:selenium - clicking a button硒 - 点击一个按钮
【发布时间】:2015-12-14 15:17:46
【问题描述】:

我正在尝试提取 Lynda.com 提供的所有课程的名称以及该主题,以便它在我的列表中显示为“2D 绘图——Soane 项目:与 Paul F. Aubin 一起使用 BIM 恢复失落的纪念碑” '。因此,我正在尝试编写一个脚本,该脚本将针对http://www.lynda.com/sitemap/categories 上的每个主题并拉出课程列表。我已经设法让 Selenium 从一个主题转到另一个主题并拉动课程。我唯一的问题是有一个“查看更多课程”按钮可以查看其余课程。有时您必须单击它几次,这就是我使用 while 循环的原因。但是 selenium 似乎没有执行这个点击。有谁知道为什么?

这是我的代码:

from selenium import webdriver

url = 'http://www.lynda.com/sitemap/categories'

mydriver = webdriver.Chrome()
mydriver.get(url)

course_list = []

for a in [1,2,3]:
    for b in range(1,73):
        mydriver.find_element_by_xpath('//*[@id="main-content"]/div[2]/div[3]/div[%d]/ul/li[%d]/a' % (a,b)).click()
        while True:
        #click the button 'See more results' as long as it´s available
            try:
                mydriver.find_element_by_xpath('//*[@id="main-content"]/div[1]/div[3]/button').click()
            except:
                break
        subject = mydriver.find_element_by_tag_name('h1') # pull out the subject
        courses = mydriver.find_elements_by_tag_name('h3') # pull out the courses
        for course in courses:
            course_list.append(str(subject.text)+"  --  " + str(course.text))
        # go back to the initial site
        mydriver.get(url)

【问题讨论】:

  • 在尝试单击按钮时是否收到ElementNotFound 异常?
  • 不,它只是完全跳过它并返回主题列表。
  • 哦...当然))您的except 捕获所有异常)尝试从Python shell“单击”您的按钮。似乎 webdriver 找不到此按钮,因为它不可见。您需要先向下滚动才能“看到”按钮
  • 如果您不确定可能出现的问题,我建议您首先从 Python shell 管理您的命令

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


【解决方案1】:

点击前滚动到元素:

see_more_results = browser.find_element_by_css_selector('button[class*=see-more-results]')
browser.execute_script('return arguments[0].scrollIntoView()', see_more_results)
see_more_results.click()

如何重复这些操作的一种解决方案可能是:

def get_number_of_courses():
    return len(browser.find_elements_by_css_selector('.course-list > li'))

number_of_courses = get_number_of_courses()

while True:
    try:
        button = browser.find_element_by_css_selector(CSS_SELECTOR)
        browser.execute_script('return arguments[0].scrollIntoView()', button)
        button.click()

        while True:
            new_number_of_courses = get_number_of_courses()
            if (new_number_of_courses > number_of_courses):
                number_of_courses = new_number_of_courses
                break
    except:
        break

警告:使用内置显式等待总是比使用while True 更好:
http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits

【讨论】:

  • 谢谢。这适用于第一次点击。但如果有超过 100 门课程,您必须多次单击才能查看所有结果。我已经把它放到了 try 子句中。
  • 你说得对,我只显示了第一次点击的代码 - 但你可以轻松地重复这些操作,直到按钮消失。
  • 我以为我会用 while 循环和 try/except 子句来实现它。我的理解是 1. 尝试向下滚动到按钮并单击它,如果它不存在(除非)从 while 循环中中断。
【解决方案2】:

问题是您正在调用一个方法来按类名查找元素,但您正在传递一个 xpath。如果您确定这是正确的 xpath,您只需将方法更改为“find_element_by_xpath”。 如果允许,建议:尽量远离这些长 xpath,并阅读一些关于如何编写高效 xpath 的教程。

【讨论】:

  • 谢谢。实际上我在粘贴代码时犯了一个错误。我正在尝试通过 xpath 或 class 查找元素,但它们都不起作用。我刚刚粘贴了 xpath,但忘记更改命令。我已经编辑了我的代码。它仍然不能解决我的问题。是的,我听说过长的 xpath 会导致问题,我会详细了解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2019-11-13
  • 2021-12-13
  • 2021-08-19
  • 2021-12-08
  • 2021-05-05
相关资源
最近更新 更多