自動化測試小技巧之Airtest-Selenium和Excel的無縫協作

AirtestProject發表於2024-06-28

此文章來源於專案官方公眾號:“AirtestProject”
版權宣告:允許轉載,但轉載必須保留原連結;請勿用作商業或者非法用途

一、前言

之前在問卷以及Q群上有同學有提出過能否將網頁上的一些資料透過Airtest去匯出生成一份Excel,那麼我們今天一起討論一下,我們應該如何去實現,以及當我們獲取的資料型別不同的時候,獲取的方式該怎麼隨之調整?

二、知識點介紹

2.1 python下的Excel的操作

之前我們有篇文章有介紹過poco跟Excel結合使用的案例,裡面介紹了Excel的讀寫操作,在這裡我們是使用了建立Excel,寫入並儲存Excel的操作。

import xlwings as xw
# 建立一個新的Excel工作簿和工作表
wb = xw.Book()
sheet = wb.sheets[0]

#將內容寫入Excel內
sheet.range((row_index, col_index)).value = cell.text

# 儲存Excel檔案
wb.save('output.xlsx')
wb.close()

2.2 獲取table資料

在網頁上看到類似圖下的表格內容時,可以在介面點選F12喚出頁面開發者模式,可以看到表格在HTML中的標籤為<table>,以及在表格中<tr>標籤是表格的行, <td>標籤是表格的列,我們只需要找到<table>標籤,將表格內的行列內容以此讀取並匯出到Excel中或輸出即可。

def get_table_data():
	#獲取表格
	table = driver.find_element(By.XPATH, "//*[@id=\"content\"]/table")

    # 獲取所有行
    rows = table.find_elements(By.TAG_NAME, "tr")

    # 行索引
    row_index = 1

    # 遍歷所有行以及每行中的列
    for row in rows:
        # 獲取所有列
        cells = row.find_elements(By.TAG_NAME, "td")
        # 列索引
        col_index = 1
        for cell in cells:
            # 寫入每個格子的內容到Excel表格
            sheet.range((row_index, col_index)).value = cell.text
            col_index += 1
        row_index += 1

2.3 獲取普通資料內容

如果是要將普通的資料依照一定的規律去進行匯出的話,我們可以看一下在瀏覽器內,資料的表現是怎麼樣的,例如我們這邊用的例子是百度熱搜介面,想要將熱搜榜匯出,我們可以先觀察一下熱搜榜的HTML程式碼排布,熱搜詞條是在同一層級下按順序排布的

那我們可以看一下在AirtestIDE內獲取的語句是否也存在一些規律,可以看到,我們在讀取的時候,語句中的其中一個標籤的索引值是呈遞增的,那我們就可以利用這個特性去進行迴圈獲取我們所需要的內容。

 # 迴圈獲取XPath範圍內的元素文字內容和連結
row_index = 1
for i in range(2, 11):  # 假設你要獲取10個元素
	xpath = f"//*[@id='sanRoot']/main/div/div/div[2]/a[{i}]/div[2]/div[2]/div/div"

	# 查詢元素
    element = driver.find_element(By.XPATH, xpath)

    # 獲取元素文字內容
    content = element.text

    # 獲取元素的父連結 (a 標籤)
    parent_element = driver.find_element(By.XPATH, xpath + "/ancestor::a[1]")
    link = parent_element.get_attribute('href')

    # 寫入Excel表格
    sheet.range((row_index, 1)).value = content
    sheet.range((row_index, 2)).value = link
    row_index += 1

三、使用Airtest-selenium獲取網頁上的table內容並生成excel

接下來我們先來看一個匯出網頁上的<table>表格資料到本地Excel表的例子:

參考程式碼:

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import WebChrome
from selenium.webdriver.common.by import By
import xlwings as xw

driver = WebChrome()
driver.implicitly_wait(20)

auto_setup(__file__)

def get_table_data():
    # 獲取所有行
    rows = table.find_elements(By.TAG_NAME, "tr")

    # 行索引
    row_index = 1

    # 遍歷所有行以及每行中的列
    for row in rows:
        # 獲取所有列
        cells = row.find_elements(By.TAG_NAME, "td")
        # 列索引
        col_index = 1
        for cell in cells:
            # 寫入每個格子的內容到Excel表格
            sheet.range((row_index, col_index)).value = cell.text
            col_index += 1
        row_index += 1

if __name__ == "__main__":
        
    # 開啟目標網頁
    driver.get("https://www.runoob.com/python3/python3-os-file-methods.html")

    table = driver.find_element(By.XPATH, "//*[@id=\"content\"]/table")  

    # 建立一個新的Excel工作簿和工作表
    wb = xw.Book()
    sheet = wb.sheets[0]

    get_table_data()

    # 儲存Excel檔案
    wb.save('output.xlsx')
    wb.close()

四、使用Airtest-selenium獲取網頁上的熱搜榜並匯出標題以及連結

然後我們再來看一個更實用的例子,獲取百度熱搜榜單內容到本地Excel的例子(PS:運營同學甚至可以做成定時指令碼,定時收集榜單資訊參考,時刻關注熱門話題):

參考程式碼:

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import WebChrome
import xlwings as xw
from selenium.webdriver.common.by import By
driver = WebChrome()
driver.implicitly_wait(20)

auto_setup(__file__)

def get_element_content_and_link(xpath, sheet, row_index):
    try:
        # 查詢元素
        element = driver.find_element(By.XPATH, xpath)
        # 獲取元素文字內容
        content = element.text
        # 獲取元素的父連結 (a 標籤)
        parent_element = driver.find_element(By.XPATH, xpath + "/ancestor::a[1]")
        link = parent_element.get_attribute('href')

        # 寫入Excel表格
        sheet.range((row_index, 1)).value = content
        sheet.range((row_index, 2)).value = link
        row_index += 1
    except Exception as e:
        print(f"元素 {xpath} 未找到: {e}")
    return row_index

if __name__ == "__main__":
    # 建立一個新的Excel工作簿和工作表
    wb = xw.Book()
    sheet = wb.sheets[0]    
    
    # 開啟目標網頁
    driver.get("https://top.baidu.com/board")  # 替換為你的目標網頁URL

    # 行索引
    row_index = 1

    # 迴圈獲取XPath範圍內的元素文字內容和連結
    for i in range(2, 11):  # 假設你要獲取10個元素
        xpath = f"//*[@id='sanRoot']/main/div/div/div[2]/a[{i}]/div[2]/div[2]/div/div"
        row_index = get_element_content_and_link(xpath, sheet, row_index)

    # 儲存Excel檔案,覆蓋已存在的檔案
    wb.save('output.xlsx')
    wb.close()

    # 關閉瀏覽器
    driver.quit()

五、小結

本週推文我們主要是講了Airtest-selenium獲取網頁上兩種不同資料並匯出到Excel表的情況,主要是介紹了關於Airtest-seleniumExcel的協作,以及在獲取不同資料內容的時候,我們應該如何去獲取以及思考指令碼思路。在實際應用過程,同學們可以根據自己的需求,去編寫更加複雜和專業的指令碼。

如果在測試的過程中,遇到了問題,或者有任何想要深入瞭解的知識點,歡迎在官方交流群(526033840)裡告訴我們或者提交issue,也歡迎大家投稿其他不同的使用小技巧。


AirtestIDE下載:airtest.netease.com/
Airtest 教程官網:airtest.doc.io.netease.com/
搭建企業私有云服務:airlab.163.com/b2b

官方答疑 Q 群:526033840

相關文章