此文章來源於專案官方公眾號:“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