如何使用Selenium的webdriver与Python检查网页的内容是否已被更改?

时间:2014-12-24 03:06:58

标签: python selenium webdriver

以20秒的时间间隔比较old_page_source和new_page_source对我来说是不成功的。

# using google chrome as my browser
driver = webdriver.Chrome('chromedriverfilepath')

# 5 trials to see how often page gets updated. Currently unsuccesful
for x in range(1, 5):
    # the webpage being analyzed
    driver.get("www.somewebsite.com")

    old_page_source = driver.page_source

    print time.strftime("\n\nTRIAL %d" % x + " ,first page fetched at time...." + 'Time: %H:%M:%S')

    driver.get("www.somewebsite.com")
    new_page_source = driver.page_source

    # keep checking every 20 seconds until page is updated/changed
    while old_page_source == new_page_source:
        sleep(20)
        driver.get("www.somewebsite.com")
        new_page_source = driver.page_source

print "page was changed at time.... " + time.strftime('Time: %H:%M:%S')

2 个答案:

答案 0 :(得分:1)

你不能依靠page_source来做你正在做的事情。 Selenium将报告的内容最有可能是浏览器首次收到的内容。作为文档mention

  

获取上次加载的页面的来源。 如果页面在加载后已被修改(例如,通过Javascript),则无法保证返回的文本是已修改页面的文本。请参阅用于确定是否使用的特定驱动程序的文档返回的文本反映了Web服务器最后发送的页面或文本的当前状态。返回的页面源是底层DOM的表示:不要期望它以与从Web服务器发送的响应相同的方式进行格式化或转义。把它想象成艺术家的印象。

(强调我的。文档是针对Java绑定的,但行为不是由Java绑定决定的,而是由浏览器端的Selenium部分决定的。所以这也适用于Python绑定。)

为了获得页面的实际状态,您应该做些什么:

driver.execute_script("return document.documentElement.outerHTML")

这将为您提供整个页面的DOM树的序列化。

答案 1 :(得分:0)

如果您只想比较文本差异,可以从body标签中获取文本。由于源页面每次加载时都可能会更改,因此永远不会进入while循环。 (例如基于会话的信息)

body = driver.find_element_by_tag_name("body")
original = body.text
newer = original
while original == newer:
    driver.get("www.somewebsite.com")
    body = driver.find_element_by_tag_name("body")
    newer = body.text
    time.sleep(20)