前言:
對於一組很多的數據,一個頁面加載不完,需要分頁加載,比如禪道的Bug數,一頁默認是20個(自己可以根據需求更改),這時就有了第二頁,第三頁等等。
這時如果要獲取所有的Bug標題來怎么做呢?
點擊下一頁Bug,你會發現url的變化,就只有最后一個數字改變,如下圖:
大體思路:
獲取所有url→ddt驅動獲取每一頁的數據
步驟:
第一步:獲取所有url
這里已經顯示了總共有幾頁和當前所在的頁面數,我們要獲取的就后面的數字 ‘3’。
先定位到這個元素,在通過正則取出后面的 ‘3’,具體代碼如下:
b=self.driver.find_element_by_xpath(".//*[@id='bugList']/tfoot/tr/td/div[2]/div/strong[2]") page=re.findall(r'/(.+?)',b.text) total_page=page[0] print('總共的頁數:',total_page)
接下來就是要用到range函數了,獲取所有的url地址了,代碼如下:
for i in range(1,int(total_page)+1): Url=url+'/zentao/bug-browse-1--unclosed-0--60-20-%s.html' % i print(Url)
最后控制台輸出如下:
觀察下,是不是只有后面的1,2,3在跟着變,其他無任何變化,這時就可以將這些url添加到一個list中去,用做接下來的ddt驅動的數據了
具體代碼如下:
#coding:utf-8 from selenium.webdriver.firefox.webdriver import WebDriver as Firefox import re,time from selenium.webdriver.support.ui import WebDriverWait class GetUrl(): '''獲取所有URL頁面''' def get_url(self,url,username,psw): self.driver=Firefox() self.driver.maximize_window() self.driver.set_page_load_timeout(20) self.driver.implicitly_wait(20) self.driver.get(url+'/zentao/user-login-L3plbnRhby8=.html') #輸入網址 WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id("account")).send_keys(username) #輸入賬號 WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_name("password")).send_keys(psw) #輸入密碼 WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id('submit')).click() #點擊登錄按鈕 time.sleep(2) self.driver.find_element_by_xpath(".//*[@id='mainmenu']/ul/li[4]/a").click() time.sleep(2) self.driver.find_element_by_xpath(".//*[@id='modulemenu']/ul/li[2]/a").click() time.sleep(2) table=self.driver.find_element_by_id('bugList') #獲取到bugList這個表格 table_rows=table.find_elements_by_tag_name('tr') #獲取行數 print(('每一頁數據的條數:'),(len(table_rows)-2)) #這里減2是減去表格最上面和最下面那行 b=self.driver.find_element_by_xpath(".//*[@id='bugList']/tfoot/tr/td/div[2]/div/strong[2]") #定位到頁面顯示總頁數那個元素(1/3) page=re.findall(r'/(.+?)',b.text) #通過正則取出后面那個總頁數(也就是那個3) total_page=page[0] print('總共的頁數:',total_page) a=[] #創建空list去接收生成的url for i in range(1,int(total_page)+1): Url=url+'/zentao/bug-browse-1--unclosed-0--60-20-%s.html' % i a.append(Url) print(a) self.driver.close() return a if __name__=='__main__': url='http://127.0.0.1' username='admin' psw='123456' a=GetUrl() a.get_url(url,username,psw)
第二步:編寫另一個類來執行
1.導入第一步的url結果
2.添加ddt驅動
3.將結果寫入TXT中
具體代碼如下:
#coding:utf-8 import unittest import ddt import time from com.Practice.test_geturl import GetUrl from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait url='http://127.0.0.1' username='admin' psw='123456' test_url=GetUrl().get_url(url,username,psw) @ddt.ddt class Test(unittest.TestCase): '''獲取所有Bug標題''' @ddt.data(*test_url) def test_01(self,test_url): self.driver = webdriver.Firefox() self.driver.get('http://127.0.0.1/zentao/user-login-L3plbnRhby8=.html') WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id("account")).send_keys('admin') WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_name("password")).send_keys('123456') WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id('submit')).click() time.sleep(1) self.driver.get(test_url) a=self.driver.find_elements_by_xpath(".//*[@id='bugList']/tbody/tr/td[4]/a") for i in a: print(i.text) try: with open('zendao.txt','a') as f: f.write(i.text+'\n') except Exception as msg: print('寫入時出錯啦:%s' % msg) time.sleep(1) def tearDown(self): self.driver.close() if __name__=='__main__': unittest.main()
這里獲取文本信息是通過table定位獲取。
最后TXT打印結果(沒截全):
這個是一個優惠券生成的網址,也是分頁顯示,原理和上面大體相同。
結語:
這個有點麻煩,應該還有更簡單的方法。只可惜小白一枚,能力不足,暫時就只能先這樣做了,歡迎大家提意見!!!