【问题标题】:Selenium doesn't wait for page to reload after button clickSelenium 在单击按钮后不等待页面重新加载
【发布时间】:2017-01-18 02:09:35
【问题描述】:

我正在使用 selenium 从使用 JavaScript 加载数据的 webpage 中抓取体育结果。我编写了一个简单的函数来获取 html 代码并将其发送到美丽的汤,然后解析相关部分(见下文)。为了获得所有结果,我需要 selenium 来单击“显示更多结果”按钮。不幸的是,这不能正常工作 - 该函数只返回最初可见的结果:

url="'http://www.flashscore.com/tennis/wta-singles/australian-open-2016/results/'"
def get_results(url):
    try:
        from urllib.request import Request, urlopen
        req = Request(url)
        s = urlopen(req,timeout=20).read()
        driver.get(url)
        try:
            driver.find_element_by_xpath("""//*[@id="tournament-page-results-more"]/tbody/tr/td/a""").click()
            time.sleep(5)
        except:
            print("No more results to show...")
        body=driver.find_element_by_id("fs-results")
        soup=BeautifulSoup(body.get_attribute("innerHTML"), "lxml")
        matches=[]
        rrows=soup.find_all("tr")
        for rrow in rrows:
            if rrow.attrs['class']!=['event_round']:
                matches.append(rrow)
    except:
        print("Webpage doesn't exist")
    return matches

该函数应返回 150 多个元素的列表,但仅返回 141。关于如何修复的任何想法?在页面有机会加载其他结果之前,代码似乎继续运行?

【问题讨论】:

  • 总是141吗?您确定该页面每次实际加载 150 多个项目吗?您可以等到项目 n° 150 显示。 ("//tr[150]" 我想)

标签: python python-3.x selenium selenium-chromedriver


【解决方案1】:

您可以使用 Python 标准库中的 time 模块。

您只需在代码后插入time.sleep(x),即可点击按钮。 x是您希望 Selenium 等待的秒数。

如果你想了解更多关于time 模块和sleep() 函数的信息,我推荐你this 页面。

【讨论】:

  • 我已经考虑过这个,但我正在寻找更清洁的东西。 x 应该有多长?五秒?这总是足够了吗?我希望有一种方法可以检查网页状态或类似的东西。
  • 您还可以使用 JavaScript 检查文档是否已加载或计算元素并在特定时间后检查是否有更多元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多