Board logo

標題: vba控制網頁 browser碰上alert停住了 [打印本頁]

作者: singo1232001    時間: 2017-1-9 07:28     標題: vba控制網頁 browser碰上alert停住了

本帖最後由 singo1232001 於 2017-1-9 07:30 編輯

https://login.104.com.tw/login.cfm
(上面為104 某某銀行的登入網站)
剛好在網路上找到一個大家都能測試的網站(主要我碰到的alert是公司內部網站)
所以用這個來測試
帳號隨便打個錯誤的,讓他跳警告來測試(code內已有順便key上aaa)

以下code測試方式
1.先打開ie 並 開啟連結
2.打開excel設定引用項目,呼叫 microsoft internet controls 和 microsoft HTML Object library
3.測試code

狀況
目前通常都會在click時.excel就整個卡住停止了,後面的點擊程序都沒開始,alert視窗必須要點掉程式才有辦法繼續跑,(不能close,我公司內部的一定要點是)

目前碰壁的思考方向
1.想說是否要在click以前先呼叫vba雙開,過個幾秒自動sendkey "enter"  [不過我測試的時候,當ie一跳出alert,整個excel都停住,包含第二個settimer的sub
2.同1,但是呼叫的是類似"自動連點程式"的外掛(聽說有人成功,但我不懂門道)
3.想說是不是可以用  .document.writeln 直接把目前的暫存網頁的"會員登入"給改掉,讓他不會跳出alert警告視窗,但必須再發出新的指令送給伺服器,是的,看能不能繞過這個警告視窗,這個視窗我完全用不到
  1. 'Private Declare Function SetFocus Lib "user32" Alias "SetFocus2" (ByVal hwnd As Long) As Long
  2. 'Private Declare PtrSafe Function WinAPISetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As LongPtr) As Long

  3. Sub getALLBrowsersaaa()
  4. On Error GoTo Err_Clear
  5.     Dim mainWorkBook As Workbook
  6.    

  7.    
  8.     Set objShell = CreateObject("Shell.Application")
  9.     Set objAllWindows = objShell.Windows
  10.     Set mainWorkBook = ActiveWorkbook

  11. For Each ow In objAllWindows
  12.     If (InStr(1, ow, "Internet Explorer", vbTextCompare)) Then
  13.         If (InStr(1, ow.LocationURL, "https://login.104.com.tw/login.cfm", vbTextCompare)) Then
  14.                

  15.     Set HTMLDoc = ow.document
  16.      HTMLDoc.all.id_name.Value = "aaa"    '< -帳號隨便打讓他跳警告
  17. For Each MyHTML_Element In HTMLDoc.getElementsByTagName("input")
  18.     If MyHTML_Element.Type = "submit" And MyHTML_Element.Value = "會員登入" Then
  19.      
  20.      
  21. '     Call 雙開vba  <先不用,想傳去給Sub StartAsub()  SetTimer Application.hWnd, 1, 15000, AddressOf getALLBrowsersaaa>
  22.      MyHTML_Element.Click   <--進入ie就卡了
  23. Do While ow.readyState <> 4 Or ow.Busy:
  24.                 DoEvents
  25.                 If ow.Busy Then
  26.                 ow.Visible = False     ''就是從新隱藏使用視窗
  27.                 ow.Visible = True      ''接著又重新顯示active使用視窗
  28.                     ow.document.Focus
  29.                     DoEvents

  30.                     Application.SendKeys "{ENTER}", True   '**按下鍵
  31.                 End If
  32.             Loop
  33. : Exit For
  34.      End If
  35.     Next



  36.     End If
  37. End If
  38.         
  39.     Next
  40. Err_Clear:
  41. If Err <> 0 Then
  42. Err.Clear
  43.     Resume Next
  44. End If

  45. '    Call StopAsub  <先不用,想傳回去StopAsub()   killtimer>
  46. End Sub
複製代碼

作者: singo1232001    時間: 2017-1-9 14:15

https://www.youtube.com/watch?v=G-2khNFYQl8

喔耶  太神拉

終於找到了

真的成功了

只要靠純文字檔案  儲存成vbs  搞定


"message from webpage"

改成警告視窗的名稱



拿純文字檔來改成下面,記得儲存成.vbs
  1. set wshshell = createobject("wscript.shell")

  2. do
  3.     ret = wshshell.AppActivate("網頁訊息")
  4. loop until ret = true

  5.     wscript.sleep 1000
  6.     ret = wshshell.appactivate("網頁訊息")
  7.         if ret = true then
  8.                    ret = wshshell.appactivate("網頁訊息")
  9.                 wscript.sleep 1000
  10.                 wshshell.sendkeys "{enter}"
  11.         end if
  12.         wscript.sleep 1000
複製代碼

作者: PKKO    時間: 2017-1-9 22:32

回復 2# singo1232001


    這個實在太酷了,我感到非常的興奮關於你找的這篇文章
我之前遇到的警告視窗,是當時我找不到相關的網頁元素
但實際上按了按鈕之後程式碼是不會停止的
因此我就算好時間用sendkey 解決了那個問題

但後來我遇到選擇檔案的按鈕一旦click之後就無法動作了,到目前仍然無解
我來試試看您的程式碼,先感謝再感謝了
作者: PKKO    時間: 2017-1-10 02:16

本帖最後由 PKKO 於 2017-1-10 02:17 編輯

回復 2# singo1232001


感謝大大的文章
經果改編之後我也成功了,非常感謝哦!!!
只是切換輸入法的問題,我是丟出一個切換輸入法的動作
不曉得有沒有甚麼方法是可以固定英文輸入法的?
  1. Set WshShell = CreateObject("wscript.shell")

  2. Do
  3.     ret = WshShell.AppActivate("選擇要上傳的檔案")
  4. Loop Until ret = True

  5. wscript.sleep 500
  6. ret = WshShell.AppActivate("選擇要上傳的檔案")
  7. If ret = True Then
  8.     ret = WshShell.AppActivate("選擇要上傳的檔案")
  9.     wscript.sleep 500
  10.     WshShell.SendKeys "%n"
  11.     WshShell.SendKeys "+"
  12.     WshShell.SendKeys "C:\USERS\USER\DESKTOP\AA.JPG"
  13.     WshShell.SendKeys "%o"
  14. End If
  15. wscript.sleep 1000
複製代碼

作者: stillfish00    時間: 2017-1-10 19:13

回復 1# singo1232001
提供另一種繞過 alert 視窗的方法
Sub test()
    Dim x
    Dim oie As Object: Set oie = CreateObject("internetexplorer.application")
    With oie
        .Visible = True
        .Navigate "https://login.104.com.tw/login.cfm"
        Do While .readystate <> 4 Or .busy: DoEvents: Loop
        .Document.getelementByid("id_name").Value = "aaa"
        For Each x In .Document.getElementsByTagName("input")
            If x.Type = "submit" And x.Value = "會員登入" Then
                With .Document.parentWindow
                   .execScript "window.nativeAlert = window.alert"   '儲存原始的alert
                    .execScript "window.alert = function() {}"    '覆寫alert function
                    x.Click
                    .execScript "window.alert = window.nativeAlert"   '還原原始的alert
                End With
                Exit For
            End If
        Next
        Do While .readystate <> 4 Or .busy: DoEvents: Loop
        .Quit
    End With
End Sub
作者: singo1232001    時間: 2017-1-11 09:07

我後來有發現到一個現象

我認為wscript 最後需要寫出一個關閉的巨集

不曉得是不是是=nothing

我在電腦程式管理員中發現

後台都沒關起來 越開越多

電腦變慢

是否有相同的狀況
作者: PKKO    時間: 2017-1-13 00:10

回復 5# stillfish00


    S大大,好特別的方式
想請教一:這個語法適用於所有網站的單一確認視窗嗎?
想請降二:若是有是或否的視窗呢?以及選擇檔案的視窗呢?有辦法處理嗎
作者: stillfish00    時間: 2017-1-13 10:53

回復 7# PKKO
想請教一:這個語法適用於所有網站的單一確認視窗嗎?

未必,看網站是用哪種方法彈出視窗,當然你也可能看不出來他是用哪種方法
主要是 alert 視窗會阻擋你的程式下一步執行,又蠻常見的,
這邊只是猜測它用 alert 方法彈出視窗,然後
對你自己建的 ie 元件,暫時性地蓋過原本的alert動作而已


想請降二:若是有是或否的視窗呢?以及選擇檔案的視窗呢?有辦法處理嗎

有是或否的視窗 推測是用 confirm 來產生的
http://www.w3schools.com/js/js_popup.asp
可以用類似方法泡製,但要回傳 true 或 false

選擇檔案的視窗,通常是要上傳檔案吧
這我不熟,網頁擷取很少做到上傳檔案的
作者: PKKO    時間: 2017-1-14 01:02

回復 8# stillfish00


    了解,非常感謝!




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