python selenium自動化(一)點擊頁面鏈接測試


需求:現在有一個網站的頁面,我希望用python自動化的測試點擊這個頁面上所有的在本窗口跳轉,並且是本站內的鏈接,前往到鏈接頁面之后在通過后退返回到原始頁面。

 

要完成這個需求就必須實現3點:

1. 找到原始頁面上面所有的在本窗口內跳轉的鏈接

2. 跳轉到目標頁面之后,“后退”到原始頁面

3. 在原始頁面上繼續點擊后續的鏈接

 

首先,要找到頁面上的所有鏈接並不困難。selenium為我們提供了find_elements_by_tag_name方法。我們只需要在初始化webdriver之后,調用

driver.find_elements_by_tag_name("a") 

就能找到頁面上的所有a標簽。

我們可以對所有的a標簽進行點擊,但是這樣的話我們不能保證所有的a標簽所指向的目標頁面都是站內的,有可能目標是其他的站外網頁;另外這樣也不能保證該跳轉頁面是在本窗口跳轉而不是新開一個窗口。

 

解決辦法:

使用selenium.webdriver.remote.webelement.WebElement提供的get_attribute方法。

通過get_attribute拿到該a標簽的各種屬性,通過判斷找到符合要求的元素進行點擊。

get_attribute("href") 得到a標簽對應的目標頁面的URL,對URL進行判斷就可以了解到該頁面是否站內頁面。我們可以知道,如果是站內頁面的話這個屬性一般會是一個相對路徑,或者包含了本站域名,但如果是站外頁面的話,那它一定是包含了“http”的一個url。

get_attribute("target")如果target不是"_blank"的話,可以判斷該頁面是在本窗口跳轉的。

 

跳轉到下一頁面后如何返回原始頁面呢?

selenium webdriver 提供了back方法可以輕松的達到這個目標:driver.back()

 

最后,需要在返回了原始頁面之后繼續點擊下一個鏈接進行測試,這個不用說肯定要使用for loop:

for i in range(0, len(driver.find_elements_by_tag_name("a"))):

在python中,如果我們指定i在range(0, x)中循環時,會以1為步長來遍歷從0到(x-1)的序列。例如:range(0,5)會得到[0, 1, 2, 3, 4]。當我們想更改range的步長時,則需要為range方法提供第三個參數。例如:range(0,5,2),則會以2為步長,得到[0,2,4]這個序列。

另外,我們也可以使用類似C#中foreach的方法:

for targetLink in driver.find_elements_by_tag_name("a"):

這種方法同樣可以遍歷所有的a標簽集合中的所有元素。

 

如果使用第二種方法,我們覺得這個需求可以簡單的實現為:

links = driver.find_elements_by_tag_name("a")
for link in links:
     if not "_blank" in link.get_attribute("target") and ("google" in link.et_attribute("href") or not "http" in link.get_attribute("href")):
          link.click()
          driver.back()

但是這樣的實現在運行時會拋出異常:

selenium.common.exceptions.StaleElementReferenceException: Message: u'Element not found in the cache - perhaps the page has changed since it was looked up'

異常的說明已經很明顯了:在cache中找不到元素,在元素被找到之后頁面變換了。 這就說明,當當前頁面發生跳轉之后,存在cache中的關於這個頁面的元素也被清空了。

因此,我們需要在每次回到原始頁面之后對我們感興趣的a標簽元素重新搜索,同時我們又必須接着上次的點擊到的元素繼續點擊。因此我們使用第一種遍歷的方法來實現這個for loop:

length = len(driver.find_elements_by_tag_name("a")

for i in range(0,length):
    links = driver.find_elements_by_tag_name("a")
    link = links[i]
    if not ("_blank" in link.get_attribute("target") or "http" in link.get_attribute("href")):
        link.click()
        driver.back()

這樣,在每次返回頁面之后會重新搜索一遍頁面上的a元素,然后使用cache中的i繼續點擊下一個跳轉鏈接。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM