Chromedriverを使ったSwitchToAlert

1,343 views
Skip to first unread message

Toshi

unread,
Jan 7, 2019, 8:07:19 AM1/7/19
to 日本Seleniumユーザーコミュニティ
下記のプログラムはExampleに含まれているコードです。
Private Sub AuthenticationDialog_Selenium()
  Dim driver As New IEDriver
  driver.Get "http://the-internet.herokuapp.com/basic_auth"
 
  Dim dlg As Alert: Set dlg = driver.SwitchToAlert(Raise:=False)
  If Not dlg Is Nothing Then
    dlg.SetCredentials "admin", "admin"
    dlg.Accept
  End If
 
  txt = driver.FindElementByCss(".example p").Text
  Assert.Matches "^Congratulations!", txt
  driver.Quit
End Sub

赤字(IEDriver)をChromeDriverに変えた場合、driver.Getの箇所で止まり、次の行へ進んでくれません。
SwitchToAlertが呼ばれないので、Basic AuthenticationにIDとパスワードを入力することができません。

と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

タカミテツロウ

unread,
Jan 7, 2019, 11:05:49 AM1/7/19
to Toshi, 日本Seleniumユーザーコミュニティ

参考には ならないかも知れませんが
こちらのサイトにあるように

サイトごとの UserName とPassword を 渡して開くのが 良いではないでしょうか?


Private Sub AuthenticationDialog_Selenium()

  Dim driver As New ChromeDriver
  
  UserName = "admin"
  Password = "admin"
  
  Auth = UserName + ":" + Password + "@"
  
  driver.Get "http://" + Auth + "the-internet.herokuapp.com/basic_auth"
    
  Application.Wait Now() + TimeValue("00:00:05")
 
  driver.Quit
    
End Sub



2019年1月7日(月) 22:07 Toshi <m.oha...@gmail.com>:
--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Toshi

unread,
Jan 7, 2019, 4:05:00 PM1/7/19
to 日本Seleniumユーザーコミュニティ
回答ありがとうございます。
ただ、ご提案された方法ではログインができない別のサイトがあり、困っております。
なんとかdriver.SwitchToAlert相当を実行したいのですが、別の方法がおわかりになられましたら、ご助言をよろしくお願いします。

2019年1月7日月曜日 22時07分19秒 UTC+9 Toshi:
下記のプログラムはExampleに含まれているコードです。
Private Sub AuthenticationDialog_Selenium()
  Dim driver As New IEDriver
  driver.Get "http://the-internet.herokuapp.com/basic_auth"
 
  Dim dlg As Alert: Set dlg = driver.SwitchToAlert(Raise:=False)
  If Not dlg Is Nothing Then
    dlg.SetCredentials "admin", "admin"
    dlg.Accept
  End If
 
  txt = driver.FindElementByCss(".example p").Text
  Assert.Matches "^Congratulations!", txt
  driver.Quit
End Sub

赤字(IEDriver)をChromeDriverに変えた場合、driver.Getの箇所で止まり、次の行へ進んでくれません。
SwitchToAlertが呼ばれないので、Basic AuthenticationにIDとパスワードを入力することができません。

タカミテツロウ

unread,
Jan 8, 2019, 6:05:53 AM1/8/19
to Toshi, 日本Seleniumユーザーコミュニティ
前提条件は ありますが
WebDriverでBasic認証を突破する は 参考になりませんでしょうか?

Private Sub AuthenticationDialog_Selenium()
  
  Dim driver As New ChromeDriver
  
  
  UserName = "admin"                                                                          ' 変更して下さい
  Password = "admin"                                                                           ' 変更して下さい
  baseUrl = "http://the-internet.herokuapp.com/"                                  ' 変更して下さい
  protectedURL = "http://the-internet.herokuapp.com/basic_auth"       ' 変更して下さい
  
  
  driver.Get baseUrl
  
  js = "var XMLReq = new XMLHttpRequest();"
  js = js + "XMLReq.open(""GET"",""" + protectedURL + """ , false,""" + UserName + """,""" + Password + """);"
  js = js + "XMLReq.send(null);"

  driver.ExecuteScript (js)
  
   
  driver.Get protectedURL
     
  
  Application.Wait Now() + TimeValue("00:00:05")
  driver.Quit
  
End Sub

2019年1月8日(火) 6:05 Toshi <m.oha...@gmail.com>:
回答ありがとうございます。
ただ、ご提案された方法ではログインができない別のサイトがあり、困っております。
なんとかdriver.SwitchToAlert相当を実行したいのですが、別の方法がおわかりになられましたら、ご助言をよろしくお願いします。

2019年1月7日月曜日 22時07分19秒 UTC+9 Toshi:
下記のプログラムはExampleに含まれているコードです。
Private Sub AuthenticationDialog_Selenium()
  Dim driver As New IEDriver
  driver.Get "http://the-internet.herokuapp.com/basic_auth"
 
  Dim dlg As Alert: Set dlg = driver.SwitchToAlert(Raise:=False)
  If Not dlg Is Nothing Then
    dlg.SetCredentials "admin", "admin"
    dlg.Accept
  End If
 
  txt = driver.FindElementByCss(".example p").Text
  Assert.Matches "^Congratulations!", txt
  driver.Quit
End Sub

赤字(IEDriver)をChromeDriverに変えた場合、driver.Getの箇所で止まり、次の行へ進んでくれません。
SwitchToAlertが呼ばれないので、Basic AuthenticationにIDとパスワードを入力することができません。

と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

--

Toshi

unread,
Jan 8, 2019, 8:27:08 AM1/8/19
to 日本Seleniumユーザーコミュニティ
回答ありがとうございました。前提条件を満たすサイトであったため、動作できました。
ただ、プログラム中にパスワードを記述するのはセキュリティ的に問題があるので、
chromeのUser Dataを使用して、記憶したパスワードを使おうと考えています。
これであれば、配布先毎に最適化しなくて済みます。
パスワード等は補完されるようになったのですが、OKボタンがクリックできません。
何か良いご提案はありますでしょうか?よろしくお願いします。

2019年1月8日火曜日 20時05分53秒 UTC+9 タカミテツロウ:
と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

タカミテツロウ

unread,
Jan 8, 2019, 6:28:57 PM1/8/19
to Toshi, 日本Seleniumユーザーコミュニティ
Enterキーを 送信されてみては 如何でしょうか?
(Declare文を 記述して下さい)

 hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)  
   chwnd = GetWindow(hwnd, 4)
    ret = SetForegroundWindow(chwnd)
 Application.Wait Now() + TimeValue("00:00:01")
 
  
   SendKeys "~"

2019年1月8日(火) 22:27 Toshi <m.oha...@gmail.com>:
と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Toshi

unread,
Jan 9, 2019, 6:06:38 AM1/9/19
to 日本Seleniumユーザーコミュニティ
早速の回答ありがとうございます。Enterキーが送れれば、最高です。
ただ、ご提案されたプログラムをどのように組み込めばいいのでしょうか?
素人で申し訳ありませんが、お付き合いください。よろしくお願いします。

2019年1月9日水曜日 8時28分57秒 UTC+9 タカミテツロウ:
と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

タカミテツロウ

unread,
Jan 9, 2019, 5:35:54 PM1/9/19
to Toshi, 日本Seleniumユーザーコミュニティ
こちらで 検証できないので 自信は ありませんが


' #If VBA7 Then   ~ #End If は コードの冒頭部に記述してください
#If VBA7 Then

   Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
   
   Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
            (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
   
   Private Declare PtrSafe Function GetWindow Lib "user32" ( _
        ByVal hwnd As LongPtr, _
        ByVal wCmd As Long) As LongPtr
        
   Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long

     
#Else
 
   Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

   Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
    (ByVal lpClassName As String, ByVal lpWindowName As String)
    As Long

  Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal
    wCmd As Long) As Long
 
   
   Private Declare Function SetForegroundWindow Lib "user32"
        (ByVal hwnd As Long) As Long
        
          
#End If



 Sub AuthenticationDialog_Selenium()
  
  Dim driver As New ChromeDriver
  
  
  UserName = "admin"                                               ' 変更して下さい
  Password = "admin"                                               ' 変更して下さい
  baseUrl = "http://the-internet.herokuapp.com/"                   ' 変更して下さい
  protectedURL = "http://the-internet.herokuapp.com/basic_auth"    ' 変更して下さい
  
  
  driver.Get baseUrl
  
  js = "var XMLReq = new XMLHttpRequest();"
  js = js + "XMLReq.open(""GET"",""" + protectedURL + """ , false,""" + UserName + """,""" + Password + """);"
  js = js + "XMLReq.send(null);"

  driver.ExecuteScript (js)
  
  ' この4行は 不要かも?
  hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
  chwnd = GetWindow(hwnd, 4)  ' 4を 0~5の整数値に 変えて実行してみる
  ret = SetForegroundWindow(chwnd)
  Application.Wait Now() + TimeValue("00:00:01")
 
  
  SendKeys "~"   ' Enterキー送信
  'SendKeys "{ENTER}" ' だめなら こちらを 試してみてください
  
      
  driver.Get protectedURL
     
  
  Application.Wait Now() + TimeValue("00:00:05")
  driver.Quit
  
End Sub


2019年1月9日(水) 20:06 Toshi <m.oha...@gmail.com>:
と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Toshi

unread,
Jan 10, 2019, 7:29:20 AM1/10/19
to 日本Seleniumユーザーコミュニティ
朝早くに返信を頂いたのに、連絡が遅くなり申し訳ありません。
下記のコードを試して見ましたが、Sendkeysでは何も文字を送れませんでした。
ちょっとこれ以上は難しいかと思います。いろいろとありがとうございました。

2019年1月10日木曜日 7時35分54秒 UTC+9 タカミテツロウ:
と記述すれば、ここのサイトはログインすることは可能ですが、別のサイトではPOP UPが出たままになり困っています。

アドバイスをよろしくお願いします。

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

--
このメールは Google グループのグループ「日本Seleniumユーザーコミュニティ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには seleniumjp+...@googlegroups.com にメールを送信してください。
このグループに投稿するには selen...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages