I.はじめに
1 SeleniumとWebドライバーをインストールする
Selenium は Python 用のサードパーティ ライブラリです。pip を使用してください。
WebドライバーについてはEdgeを使用し、公式Webサイトにアクセスしてダウンロードします。
Microsoft Edge WebDriver - Microsoft Edge 開発者
Chromeなど他のブラウザをご利用の場合も同様の操作となります。
ダウンロード後、
インターネット上のチュートリアルの中には、環境変数の登録などの操作が必要なものもあります。不必要な気がする
Webdriver を解凍し、msedgedriver.exe を入手します。
これを Python インタプリタの下に置くと、私の場合は次のようになります。
C:\Users\520\AppData\Local\Programs\Python\Python310。
それをpython310フォルダに置きます。
2ポデザインパターン
率直に言うと、po の設計パターンはセレンを再カプセル化することです。
単純なキーワードのカプセル化
def locates(self, name, value):
return self.driver.find_elements(name, value)
def xpaths(self, value):
return self.locates(By.XPATH, value)
"""
这段代码本质上就是对find_elements的封装
再结合对xpath进行的封装。
"""
本文には私自身のカプセル化がたくさんあります、はははは、
最後に使用済みのものを渡します。
メインテキスト2冊
1 ログイン
携帯電話番号とパスワードを入力する必要があります。
class Xuexitong:
def __init__(self,n=1):
self.driver=web()
self.n=n
# n 后面再说什么意思
# 初始化,得到webdriver对象
def login(self):
# open 就是对get方法的封装
self.driver.open('https://passport2.chaoxing.com/login?fid=&newversion=true&refer=http%3A%2F%2Fi.chaoxing.com')
self.driver.i_put('phone','xxxxx')
# i_put 对id,find_element,send_keys的封装
self.driver.i_put('pwd','xxxxx')
self.driver.i_click('loginBtn')
# i_click是id和click的封装
上記のプロセスは次のとおりです。
公式サイトを開く→携帯電話番号を入力→パスワードを入力→OKボタンをクリック
2 コースを選択する
def click_course(self):
self.driver.wait(1)
# 等待1s time.sleep的封装
self.driver.switch_frame('frame_content')
# 进入框架,很重要,不然会找不到元素。
# self.n 就是课程的序号,从1到最后,选择自己需要点击的课程
self.driver.x_click(f'//*[@class="course-list"]/li[{self.n}]/div/a')
3 クリックするコースの数を決定します)
コース番号は 1 と表示されるものと、2 と表示されるものがあります。当然 1 を除外して 2 をクリックします。
def choose_window(self):
# 需要先切换窗口,选择句柄,不妨称为列表窗口
# 不然还是再原来的窗口
self.driver.switch_handle(-1)
self.driver.wait(1)
# 进入列表窗口的框架
self.driver.switch_frame('frame_content-zj')
def get_course_nums(self):
course_nums=[]
self.choose_window()
course=self.driver.xpaths('//*[@class="chapter_unit"][3]/div[2][1]/ul/li/div/div/div[3]/div/span[1]')
# couser 就是用了xpaths, 得到课程数,返回的是元素
for t in course:
value=self.driver.get_text(t)
# 得到内容
course_nums.append(value)
# 比如是这样的[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2]等的
# 也有可能有3。
return course_nums
4 入りたい章をクリックする
def main(self):
self.login()
self.click_course()
nums=self.get_course_nums()
# 前面的操作。得到课程数
for i,t in enumerate(nums):
# 循环
if t=='2':
# 对章节数的进行后续操作,play操作
self.play(i+1)
5 再生操作
def play(self,num):
self.choose_window()
# 选择窗口
self.start_play(num)
# start_play操作
6 start_play オペレーション
def start_play(self,num):
self.driver.x_click(f'//*[@class="chapter_unit"][3]/div/ul/li[{num}]/div/div/div[3]')
# 点击跳转
self.driver.switch_handle(-1)
# 选择窗口
self.driver.switch_frame('iframe')
# 进入框架
self.driver.switch_frame('//*[@id="ext-gen1049"]/iframe')
# 进入框架
self.driver.wait(2)
self.driver.x_click('//*[@class="vjs-big-play-button"]')
# 点击播放按钮
while 1:
# 等待播放完成
flag = self.get_new_num()
if flag:
break
return False
def get_new_num(self):
self.driver.wait(10)
div = self.driver.xpath(f'//*[@id="reader"]/div')
get_class = self.driver.get_attr(div, 'class')
tag_class = 'video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-user-inactive vjs-paused vjs-ended'
tag_class1='video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-paused vjs-ended vjs-user-inactive'
# 播放完成或有某些标签的变化。仔细寻找
if get_class == tag_class or get_class==tag_class1:
self.driver.switch_default()
self.driver.x_click('//*[@id="contentFocus"]/i')
# 退出按钮
self.driver.wait(4)
return True
7 ウィンドウの選択
def choose_window(self):
self.driver.switch_handle(-1)
self.driver.wait(1)
self.driver.switch_frame('frame_content-zj')
上記の操作 --- テストするビデオを選択 -> 再生をクリック -> 再生が完了するまで待機 -> 終了
具体的な実際の状況は、お客様自身の運用と変化への適応に依存します。
3つのソースコード
from init import web
# 封装导包
class Xuexitong:
def __init__(self,n=1):
self.driver=web()
self.n=n
self.main()
def login(self):
self.driver.open('https://passport2.chaoxing.com/login?fid=&newversion=true&refer=http%3A%2F%2Fi.chaoxing.com')
self.driver.i_put('phone','xx')
self.driver.i_put('pwd','xx')
self.driver.i_click('loginBtn')
def click_course(self):
self.driver.wait(1)
self.driver.switch_frame('frame_content')
self.driver.x_click(f'//*[@class="course-list"]/li[{self.n}]/div/a')
def get_course_nums(self):
course_nums=[]
self.choose_window()
course=self.driver.xpaths('//*[@class="chapter_unit"][3]/div[2][1]/ul/li/div/div/div[3]/div/span[1]')
for t in course:
value=self.driver.get_text(t)
course_nums.append(value)
return course_nums
def main(self):
self.login()
self.click_course()
nums=self.get_course_nums()
for i,t in enumerate(nums):
if t=='2':
self.play(i+1)
def play(self,num):
self.choose_window()
self.start_play(num)
def get_new_num(self):
self.driver.wait(10)
div = self.driver.xpath(f'//*[@id="reader"]/div')
get_class = self.driver.get_attr(div, 'class')
tag_class = 'video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-user-inactive vjs-paused vjs-ended'
tag_class1='video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-paused vjs-ended vjs-user-inactive'
if get_class == tag_class or get_class==tag_class1:
self.driver.switch_default()
self.driver.x_click('//*[@id="contentFocus"]/i')
self.driver.wait(4)
return True
def start_play(self,num):
self.driver.x_click(f'//*[@class="chapter_unit"][3]/div/ul/li[{num}]/div/div/div[3]')
self.driver.switch_handle(-1)
self.driver.switch_frame('iframe')
self.driver.switch_frame('//*[@id="ext-gen1049"]/iframe')
self.driver.wait(2)
self.driver.x_click('//*[@class="vjs-big-play-button"]')
while 1:
flag = self.get_new_num()
if flag:
break
return False
def choose_window(self):
self.driver.switch_handle(-1)
self.driver.wait(1)
self.driver.switch_frame('frame_content-zj')
def main():
Xuexitong()
4 つのカプセル化されたコード
私の github リポジトリを参照してください