Airtest-Selenium實操小課④:微信讀書上閱讀書籍

AirtestProject發表於2024-06-21

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

1. 前言

上一課我們講到用Airtest-Selenium爬取下載可愛的貓貓圖片,還沒看的同學可以戳這裡看看~

那麼今天的推文,我們就來說說看,怎麼實現模擬真人去開啟微信讀書網站,點選進入書本進行閱讀。

2.需求分析和準備

整體的需求大致可以分為以下步驟:

  • 開啟chrome瀏覽器
  • 開啟百度網頁
  • 搜尋“微信讀書”
  • 點選進入“微信讀書”官網
  • 搜尋關鍵詞“長安的荔枝”
  • 點選進入“長安的荔枝”書本
  • 翻閱書籍前五章內容

在寫指令碼之前,我們需要準備好社群版AirtestIDE(目前最新版為1.2.17),設定好chrome.exe地址和對應的driver即可。

3. 指令碼實現與執行效果

3.1 指令碼執行效果

在執行過程中,我們將每次的搜尋結果透過讀取url連結的方式去實現頁面跳轉,在進入到書籍閱讀介面時,根據讀取到的頁面高度、文件高度、去計算可滑動高度,實現滑動閱讀的操作。並且根據頁面的JS距離去判斷是否已經滑動到文件底部,從而執行點選下一章的操作。

先來看下我們整體的執行效果:

3.2 完整程式碼分享

這裡也附上完整的示例程式碼給大家參考,有需要的同學可以自取學習哦:

# -*- 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

# 建立一個例項
driver = WebChrome()
driver.implicitly_wait(20)

def start_selenium():
    driver.get("https://www.baidu.com/")
    # 輸入搜尋關鍵詞並提交搜尋
    search_box = driver.find_element_by_name('wd')
    search_box.send_keys('微信讀書')
    search_box.submit()

    # 獲取搜尋結果並開啟新頁面
    open_new_page()

    # 滾動頁面並閱讀章節
    read_chapters()


def open_new_page():
    # 使用XPath查詢文字為 "微信讀書" 的元素並點選
    try:
        element = driver.find_element_by_xpath("//div[@id='content_left']/div[@id='1']/div[@class='c-container']/div[1]/h3[@class='c-title t t tts-title']/a")
    except Exception as e:
        element = driver.find_element_by_xpath('//*/text()[normalize-space()="微信讀書"]/parent::*')
    element.click()

    # 獲取所有視窗控制代碼
    window_handles = driver.window_handles
    # 切換到新開啟的視窗
    driver.switch_to.window(window_handles[1])
    # 獲取新頁面的連結
    new_page_url = driver.current_url
    # 列印新頁面的連結
    print(f"新頁面的連結: {new_page_url}")
    driver.get(new_page_url)
    
    #點選搜尋書籍《長安的荔枝》
    driver.find_element_by_xpath("//input[@type='text']").click()
    driver.find_element_by_xpath("/html/body/div[7]/div/div/div[2]/div/input").send_keys("長安的荔枝")
    driver.find_element_by_xpath("/html/body/div[7]/div/div/div[2]/span[2]").click()


    # 獲取a標籤的URL以及書籍簡介
    search_box = driver.find_element_by_xpath("/html/body/div[7]/div/div[3]/div/ul/li/a")
    print(f"a標籤的文字: {search_box.text}")
    url = search_box.get_attribute('href')
    # 列印URL
    print(f"URL: {url}")
    driver.get(url)  # 請求搜尋連結-跳轉

#開始閱讀
def read_chapters():
	#切換上下滾動閱讀模式
    button = driver.find_element(By.CSS_SELECTOR,"button[title='切換到上下滾動閱讀'].readerControls_item.isHorizontalReader")
    button.click()

    for i in range(5):  # 閱讀章節5章
        # 滾動到頁面最下方
        scroll_to_bottom()
        sleep(5)
        # 點選下一章節按鈕
        next_chapter = driver.find_element(By.XPATH,"//div[@class='readerFooter']/div/button[@class='readerFooter_button']")
        next_chapter.click()

#滑動書籍
def scroll_to_bottom():
    while True:
        is_bottom = driver.execute_script('return (window.innerHeight + window.pageYOffset) >= document.documentElement.scrollHeight;')
        # 判斷是否滾動到螢幕最底部
        if not is_bottom:
            # 獲取頁面高度
            heig_ = driver.execute_script("return document.body.scrollHeight;")
            # 獲取當前頁面底部距離頂部的距離
            next_ = driver.execute_script("return (window.innerHeight + window.pageYOffset);")
            # 計算滾動距離
            p_num = heig_ / 1000
            print(heig_ / 1000)
            # 滾動到頁面最下方
            driver.execute_script(f"window.scrollTo(0, {p_num + next_});")
            sleep(2)
        else:
            print('已滾動到螢幕最底部')
            break

#管理 WebDriver 的生命週期
class SeleniumDriver:
    def __enter__(self):
        return driver

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass


if __name__ == "__main__":
    with SeleniumDriver():
        start_selenium()

3.2 重要知識點

1)返回當前頁面的文件在垂直方向上的高度
driver.execute_script("return document.body.scrollHeight;")
2)獲取當前頁面可見區域的高度和頁面滾動距離
driver.execute_script("return (window.innerHeight + window.pageYOffset);")

3) 判斷頁面是否已經滾動到底部

driver.execute_script('return (window.innerHeight + window.pageYOffset) >= document.documentElement.scrollHeight;')
4)管理WebDriver的生命週期

如果不需要完成任務後就關閉瀏覽器的話,可以在exit的時候直接pass處理,如果需要立即關閉瀏覽器的話,可以選擇在exit函式內填入driver.close()

class SeleniumDriver:
    def __enter__(self):
        return driver

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass

4. 注意事項與小結

4.1 相關教程

  • 如何使用Airtest-selenium進行web端的頁面元素互動
  • 如何設定chromedriver以及一些常見的web指令碼問題
  • 為什麼AirtestIDE無法檢索web控制元件?

4.2 課程小結

在本週的課程中,我們介紹瞭如何使用Airtest-selenium在微信讀書web端上模擬閱讀書籍的操作,也分享了Airtest-selenium比較常見的獲取滑動距離、計算滑動距離以及判斷是否到底部的用法。但是,請大家注意,我們的分享僅供學習參考哦!我們分享的程式碼並不是永遠適用的,因為網頁的頁面元素可能會不斷更新。

同時,我們也非常歡迎同學們能夠提供自己常用場景的程式碼,我們會積極分享相關的使用技巧。讓我們一起努力,共同進步~


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

官方答疑 Q 群:526033840

相關文章