關於selenium 多開分頁 切換 移動 關閉 新分頁 重啟 等語法
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
關於selenium 多開分頁 切換 移動 關閉 新分頁 重啟 等語法
本帖最後由 singo1232001 於 2023-7-21 13:14 編輯
留作備忘 這問題答案 一直不好找 也只有非常大量使用爬蟲 較容易會碰到
由於資料不是很充足 困擾很久 但由於剛好本身有需求 就測試下去 並且去國外抓資料
乾脆寫一篇文章
對於selenium 分頁操作的功能 稍微說明一下
舉google網頁為例
url = "https://www.google.com.tw/"
1.新開分頁 (需再已有driver.get url 已開啟一個基本分頁時)
driver.executeScript ("window.open('" & url & "')") '這種做法 分頁啟用焦點會順便過去
而若使用
'driver.executeScript ("window.open()")
'driver.SwitchToNextWindow
'driver.get url
則容易遇到 分頁的啟用焦點出問題的情況 雖然勉強還是可以用
2.遇到"同Title"但"cookie網址會變化的"分頁超連結按鈕或超連結選項
先去find物件元素是哪個 找到後 再利用Attribute 把href的網址資料取出
href_url = Find物件元素下.Attribute("href")
driver.executeScript ("window.open('" & href_url & "')")
3.關閉分頁 driver.close
關閉分頁必須有後續動作
例:假設有5個分頁 1 2 3 4 5 , 並且再分頁5 執行driver.close的狀況下
雖然關閉分頁5後 會剩下1 2 3 4 但是1 2 3 4 都無法操控 因為啟用(激活)的焦點還再5上面
這時候 有4種方法可以處理
3-1 使用 driver.SwitchToNextWindow
可以跳到下一個分頁 且可以循環
接續上述狀況 關閉分頁5之後 使用跳下一分頁 會回到分頁1 若繼續使用 會繼續到分頁2 而且還可以繼續往分頁3跳
(但此種功能 會在運氣差的情況下大概2~3% 會完全無作用失效 但狀況不是隨機 會重複出現)
3-2使用 driver.SwitchToPreviousWindow
可跳回上一個分頁 但無法循環 若123個分頁 在分頁2使用跳回上一個分頁 會回到分頁1
但若繼續使用 又會回到分頁2
補充:若3-1 ,3-2 想要依照"網址關鍵字"查詢 可以利用 迴圈 與like的方式做搭配
例:
For i = 1 to 10 '(隨便設數量 反正比分頁數多就好 至少能繞一圈)
driver.SwitchToPreviousWindow
if driver.url like "*google*" then exit for
Next
補充 當然也可以使用 driver.Windows.Count 可以查詢所有分頁數量
3-3 使用 driver.SwitchToWindowByTitle "google"
若使用此種方式 只能針對該指定的分頁title 必須是唯一的
假如 4個分頁的名稱 都是 "google" 那麼 將找到第一個名為google的分頁
3-4 使用 下面兩種方式 可以依分頁數索引指定跳頁
Debug.print driver.Windows.Item(i).Title
或
x = driver.Windows.Item(i).Title
不要問我為啥長這樣 我也搞不懂 非常奇妙
當然也可以搭配上面的迴圈
For i = 1 To driver.Windows.Count
x= driver.windows.Item(i)
If driver.title = "google" Then Exit For
Next
或者
For i = 1 to driver.Windows.Count
x= driver.windows.Item(i)
If driver.url like "*google*" Then Exit For
Next
或者
For each z in driver.windows
x= z.title
If driver.url like "*google*" Then Exit For
Next
或者
For each z in driver.windows
z.title
If driver.url like "*google*" Then Exit For
Next
當然還有一種很特殊的延時強制重啟方式 需用到很多功能搭配 與本次主題稍微有關
跳頁刷新的時候 有時候容易遇到斷網 或者 錯誤之類 導致程序中斷
例子如下
Dim lasttimevalue '這行要在最頂部
Sub 強制30秒後重啟() '這兩個程序都在 模組(Module1) 底下
Set driver = Nothing
lasttimevalue = Now + TimeValue("00:00:30")
Application.OnTime lasttimevalue, "Module1.主程序"
End sub
Sub 主程序()
On error goto errorhandle
..............
........
errorhandle:
If Err.Number = 23 Then Run "Module1.強制30秒後重啟": Exit Sub '不一定要=23 ,可以依照碰到的err.number調整 或者直接設>0
End sub |
|
|
|
|
|
|