Board logo

標題: 關於selenium 多開分頁 切換 移動 關閉 新分頁 重啟 等語法 [打印本頁]

作者: singo1232001    時間: 2023-7-21 13:02     標題: 關於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




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)