1. 程式人生 > >selenium之 瀏覽器導航欄的三個按鈕(back、forward、refresh)

selenium之 瀏覽器導航欄的三個按鈕(back、forward、refresh)

今天這幾個方法非常簡單,就是我們能看到的瀏覽器導航欄的三個按鈕:後退、前進、重新整理

導航欄按鈕

driver.back()
driver.forward()
driver.refresh()

不多說,上程式碼試試

# -*- coding: utf-8 -*-

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
print 'base_url: '
, driver.current_url driver.find_element_by_id('kw').send_keys(u'selenium 灰藍') driver.find_element_by_id('su').click() sleep(2) print 'after search: ', driver.current_url driver.back() # back print 'back to: ', driver.current_url driver.forward() # forward print 'forward to: ', driver.current_url sleep(2
) driver.refresh() # refresh print 'refresh: ', driver.current_url sleep(2) driver.quit()

結果:
明顯能夠看到瀏覽器的後退、前進與重新整理的動作。

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium%20%E7%81%B0%E8%93%9D&rsv_pq=f88ee279000319b4&rsv_t=3537ECuJsvn8biOOxAemTJhRgJA9fRB%2FgYyaBy3sdcQagRhU5jOqEDICoQI
&rqlang=cn&rsv_enter=0&rsv_sug3=11&inputT=266&rsv_sug4=266 https://www.baidu.com/ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium%20%E7%81%B0%E8%93%9D&rsv_pq=f88ee279000319b4&rsv_t=3537ECuJsvn8biOOxAemTJhRgJA9fRB%2FgYyaBy3sdcQagRhU5jOqEDICoQI&rqlang=cn&rsv_enter=0&rsv_sug3=11&inputT=266&rsv_sug4=266 https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium%20%E7%81%B0%E8%93%9D&rsv_pq=f88ee279000319b4&rsv_t=3537ECuJsvn8biOOxAemTJhRgJA9fRB%2FgYyaBy3sdcQagRhU5jOqEDICoQI&rqlang=cn&rsv_enter=0&rsv_sug3=11&inputT=266&rsv_sug4=266

那麼什麼時候會用呢?

一種情況就是,當你從一個父頁面跳轉到子頁面進行操作,操作完之後沒有“返回”之類的按鈕或連結,重新進入父頁面又很麻煩,back()可以幫你。forward()與此類似,相對沒有back()那麼常用。

當你修改了頁面資訊但是沒有即時重新整理時,可以手動refresh()。

不過需要注意:

當你前進並退回原來的頁面或重新整理頁面之後,頁面的元素id是改變了的。不要妄圖用原來定位好的WebElement去操作現在的頁面元素!否則會出現如下報錯:
selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up

程式碼示例下:

# -*- coding: utf-8 -*-

from selenium import webdriver

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')


kw = driver.find_element_by_id('kw')
print kw  # 原頁面元素ID

driver.refresh()

print driver.find_element_by_id('kw')  # 重新整理之後的kw元素ID
kw.send_keys('csdn')  # 再用原來的元素ID去操作就會丟擲異常

driver.quit()

來看看輸出結果:

<selenium.webdriver.remote.webelement.WebElement (session="19a16be7-f885-4454-aa44-065b35d8377f", element="{307bfd7c-bcb8-4bed-a0f0-164924e9f648}")>
<selenium.webdriver.remote.webelement.WebElement (session="19a16be7-f885-4454-aa44-065b35d8377f", element="{8eac4fb5-4c8f-4141-b9d5-2ced9b412388}")>
Traceback (most recent call last):
  File "D:/Code/py files/zhigou/zhigou_framework/test/UI_test/case/testnavigation.py", line 16, in <module>
    kw.send_keys('csdn')  # 再用原來的元素ID去操作就會丟擲異常
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\webelement.py", line 334, in send_keys
    self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': typing})
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\webelement.py", line 469, in _execute
    return self._parent.execute(command, params)
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up
Stacktrace:
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web-element-cache.js:9407)
    at Utils.getElementAt (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/[email protected]/components/command-processor.js:8992)
    at fxdriver.preconditions.visible (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/[email protected]/components/command-processor.js:10043)
    at DelayedCommand.prototype.checkPreconditions_ (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/[email protected]/components/command-processor.js:12597)
    at DelayedCommand.prototype.executeInternal_/h (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/[email protected]/components/command-processor.js:12614)
    at DelayedCommand.prototype.executeInternal_ (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/[email protected]/components/command-processor.js:12619)
    at DelayedCommand.prototype.execute/< (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/[email protected]/components/command-processor.js:12561)

能看到兩次輸出的WebElement是完全不同的,還用原來的元素去操作當然是不行的:

兩次WebElement不同

所以在有可能有頁面重新整理的時候,不要用這種獲取到元素,然後一直操作這個元素的寫法;要在重新整理之後重新獲取一下元素進行操作。