Seleniumの使い方 - 基本操作

ブラウザ起動

WebDriverのインスタンスを作成すると、ブラウザが表示されます。
使用するブラウザによって参照するdll・名前空間・クラスは異なりますが、似たような定義方法です。
ブラウザのオブジェクトを格納する変数をインタフェースで定義すれば、どのブラウザ用のオブジェクトでも格納できます。

以下は各種ブラウザのインスタンスを作成するサンプルです。

						Imports OpenQA.Selenium
						Imports OpenQA.Selenium.IE
						Imports OpenQA.Selenium.Chrome
						Imports OpenQA.Selenium.Firefox
						
						Public Class Form1
						
							Private driver As IWebDriver
						
							'IE
							Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
						
								driver = New IE.InternetExplorerDriver()
						
							End Sub
						
							'Chrome
							Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
						
								driver = New ChromeDriver()
						
							End Sub
						
							'Firefox
							Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
						
								driver = New FirefoxDriver()
						
							End Sub
						
						End Class
					
						using OpenQA.Selenium;
						using OpenQA.Selenium.IE;
						using OpenQA.Selenium.Chrome;
						using OpenQA.Selenium.Firefox;
						
						public class Form1
						{
							private IWebDriver driver;
						
							// IE
							private void Button1_Click(object sender, EventArgs e)
							{
								driver = new IE.InternetExplorerDriver();
							}
						
							// Chrome
							private void Button2_Click(object sender, EventArgs e)
							{
								driver = new ChromeDriver();
							}
						
							// Firefox
							private void Button3_Click(object sender, EventArgs e)
							{
								driver = new FirefoxDriver();
							}
						}
						
					
						from selenium import webdriver
						from selenium.webdriver.common.by import By
						
						#Chromeブラウザを表示
						#PATHを設定していない場合は、executable_pathにドライバーの格納場所を指定
						chrome = webdriver.Chrome(executable_path=r'C:\Users\xxxx\Desktop\python\chromedriver')
						edge = webdriver.Edge(executable_path=r'C:\Users\xxxx\Desktop\python\msedgedriver.exe')
					
						'ブラウザ起動
						Sub OpenBrowser()
						 
							'各ブラウザのドライバのオブジェクトを作成
							Dim chromeDriver As New Selenium.chromeDriver
							Dim edgeDriver As New Selenium.edgeDriver
						 
							'ブラウザを起動
							Call chromeDriver.Start
							Call edgeDriver.Start
						
						End Sub
					

また、C#やVBの場合、各DriverのクラスはIDisposableインタフェースを備えていますので、usingも使えます。
usingが終了するタイミングでブラウザも自動で終了します。

						'IE
						Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
						
							Using driver As New IE.InternetExplorerDriver()

								'ここにIE操作処理を記載
			
							End Using

						End Sub
					
						// IE
						private void Button1_Click(object sender, EventArgs e)
						{
							using (IE.InternetExplorerDriver driver = new IE.InternetExplorerDriver())
							{
								//ここにIE操作処理を記載
							}
						}
					

Webページの表示

以下の方法があります。

Urlプロパティへの設定

						driver.Url = "https://www.yahoo.co.jp"
					
						driver.Url = "https://www.yahoo.co.jp";
					

GoToUrlメソッド

						driver.Navigate().GoToUrl("https://www.yahoo.co.jp")
					
						driver.Navigate().GoToUrl("https://www.yahoo.co.jp");
					

getメソッド

						driver.get("https://www.yahoo.co.jp")
					
						driver.Get ("https://yahoo.co.jp")
					

読み込み待ち

SeleniumでWeb操作を実行していると、プログラムの速度が早すぎて読み込みが終わっていないのに次の要素の操作を行おうとして、
エラーが発生する場合があります。 JavaScriptで動的に要素が作成される場合も同様です。
そのため、読み込みが伴う操作後には、要素を検出できるまでの待機が必要です。

Seleniumの読み込み待ちには2種類の方法があります。

Webページ上のコンテンツが読み込まれるまで待機する方法

OpenQA.Selenium.Support.UI.WebDriverWaitクラスとUntilメソッドを使用します。
WebDriverWaitにより、任意のHTML要素が取得できるまで(ページが読み込まれ、使用する要素が使用可能となるまで)
指定時間を待機します。
Untilで要素の取得条件を指定します。
指定時間が経過しても読み込みが終わらない(=要素が取得できない)場合は、TimeoutException例外が発生します。

また、待機条件は「要素がクリック可能になれば」「要素のテキストが変更されれば」のように、細かくカスタマイズすることができます。詳しくはこちらを参照ください。
							Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

								'Chromeブラウザを表示
								Dim driver As New ChromeDriver()
						
								'ページを表示
								driver.Navigate().GoToUrl("https://www.yahoo.co.jp")
						
								'ページが表示されるまで(検索欄が認識できるまで)待機
						
								Try
									'Imports OpenQA.Selenium.Support.UI
									Dim element = New WebDriverWait(driver, TimeSpan.FromSeconds(3)).Until(Function(drv) drv.FindElement(By.Name("p")))
						
									'新しいSeleniumではExpectedConditionsは廃止されている
									'旧いのと同じ処理を行いたい場合、NuGetから「DotNetSeleniumExtras.WaitHelpers」からインストールする。
									'Dim element As IWebElement = New WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//a/h3")))
						
								Catch ex As TimeoutException
									Console.WriteLine(ex.Message)
								End Try
						
							End Sub
						
							private void button1_Click(object sender, EventArgs e)
							{
								var driver = new ChromeDriver();
					
								driver.Url = "https://www.yahoo.co.jp";
					
								try
								{
									//using OpenQA.Selenium.Support.UI;
									var element = new WebDriverWait(driver, TimeSpan.FromSeconds(3)).Until(drv => drv.FindElement(By.Name("p")));
					
									//新しいSeleniumではExpectedConditionsは廃止されている
									//旧いのと同じ処理を行いたい場合、NuGetから「DotNetSeleniumExtras.WaitHelpers」からインストールする。
									//IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//a/h3")));
								}
								catch (TimeoutException ex)
								{
									Console.WriteLine(ex.Message);
								}
							}
						
							from selenium import webdriver
							from selenium.webdriver.common.by import By
							from selenium.webdriver.support.ui import WebDriverWait
							from selenium.webdriver.support import expected_conditions as EC
							
							#Chromeブラウザを表示(環境変数のPATHにドライバーのパスを追加済とする)
							driver = webdriver.Chrome()
							
							#ページを表示
							driver.get("https://www.yahoo.co.jp")
							
							#ページが表示されるまで(検索欄が認識できるまで)待機
							element = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.NAME, "p")))
							
							#テキストの入力
							element.send_keys("Selenium")
						
							Sub Wait()

								'Chromeブラウザを表示
								Dim driver As New chromeDriver
								Call driver.Start
							
								'ページを表示
								driver.Get ("https://yahoo.co.jp")
							
								'要素が認識できるまで待機
								Dim By As New By
								Dim i As Integer
								i = 0
								Do Until i > 3
									If driver.IsElementPresent(By.ID("p")) Then
										Exit Do
									End If
									driver.Wait 1000
									i = i + 1
								Loop
							
							End Sub
						

要素を取得するときに待機が行われる方法

Manage().Timeouts().ImplicitWaitを一度設定しておけば、
以降のFindElementFindElementsで要素を取得するときに、毎回待機が行われるようになります。
							Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

								'Chromeブラウザを表示
								Dim driver As New ChromeDriver()
						
								'タイムアウト時間を設定
								driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10)
						
								'ページを表示
								driver.Navigate().GoToUrl("https://www.yahoo.co.jp")
						
								'ページが表示されるまで(検索欄が認識できるまで)待機
								Try
						
									Dim element As IWebElement = driver.FindElement(By.Name("p"))
						
								Catch ex As TimeoutException
									Console.WriteLine(ex.Message)
								End Try
						
							End Sub
						
							private void button2_Click(object sender, EventArgs e)
							{
								//Chromeブラウザを表示
								var driver = new ChromeDriver();
					
								//タイムアウト時間を設定
								driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
					
								//ページを表示
								driver.Url = "https://www.yahoo.co.jp";
					
								try
								{
									//ページが表示されるまで(検索欄が認識できるまで)待機
									var element = driver.FindElement(By.Name("p"));
								}
								catch (TimeoutException ex)
								{
									Console.WriteLine(ex.Message);
								}
							}
						
							from selenium import webdriver
							from selenium.webdriver.common.by import By
							from selenium.webdriver.support.ui import WebDriverWait
							from selenium.webdriver.support import expected_conditions as EC
							
							#Chromeブラウザを表示(環境変数のPATHにドライバーのパスを追加済とする)
							driver = webdriver.Chrome()
							
							#タイムアウト時間を設定
							driver.implicitly_wait(10)
							
							#ページを表示
							driver.get("https://www.yahoo.co.jp")
							
							#ページが表示されるまで(検索欄が認識できるまで)待機
							element = driver.find_element(By.NAME, "p")
							
							#テキストの入力
							element.send_keys("Selenium")						
						
							Sub Wait2()

								'Chromeブラウザを表示
								Dim driver As New Selenium.chromeDriver
								Call driver.Start
							
								'タイムアウト時間を設定
								driver.Timeouts.ImplicitWait = 10000
							
								'ページを表示
								driver.Get ("https://yahoo.co.jp")
								
								'要素が認識できるまで待機
								Dim element As WebElement
								Set element = driver.FindElementByName("p")
								
							End Sub
						

参考

待機
Selenium Web Driver, ExpectedConditions [deprecated] alternative

戻る/進む/更新

						driver.Navigate().Back()
						driver.Navigate().Forward()
						driver.Navigate().Refresh()
					
						driver.Navigate().Back();
						driver.Navigate().Forward();
						driver.Navigate().Refresh();
					
						driver.back()
						driver.forward()
						driver.refresh()
					
						driver.GoBack
						driver.GoForward
						driver.Refresh
					

タイトル/URLの取得/ソースコードの取得

現在表示しているサイトのタイトルとURLを取得します。

						MsgBox(driver.Title)    'タイトルを表示する
						MsgBox(driver.Url)      'URLを表示する
						MsgBox(driver.PageSource)  'ソースを表示する
					
						MessageBox.Show(driver.Title);    //タイトルを表示する
						MessageBox.Show(driver.Url);      //URLを表示する
						MessageBox.Show(driver.PageSource);  //ソースを表示する
					
						print(driver.title)
						print(driver.current_url)
						print(driver.page_source)
					
						MsgBox (driver.Title)   'タイトルを表示する
						MsgBox (driver.Url)     'URLを表示する
						MsgBox (driver.PageSource) 'ソースを表示する
					

alert/confirm/promptの操作

alert/confirm/promptのダイアログを操作する方法です。
browser.SwitchTo().Alert()でダイアログのオブジェクトを取得でき、AcceptDismissでボタンを押下します。

						'下記コードの動作確認はテストページ(https://web.biz-prog.net/test/testpage.html)で
						Private Sub btnAlert_Click(sender As Object, e As EventArgs) Handles btnAlert.Click
					
							'------------------------
							'alert表示
							CType(driver, IJavaScriptExecutor).ExecuteScript("alert('alert test');")
					
							'alertのオブジェクトを変数に格納
							Dim alert As IAlert = driver.SwitchTo().Alert()
					
							'alertのテキストを取得
							MsgBox(alert.Text)
					
							'OKボタンを押す
							alert.Accept()
					
							'------------------------
							'confirm表示
							CType(driver, IJavaScriptExecutor).ExecuteScript("confirm('confirm test');")
					
							'confirmのオブジェクトを変数に格納
							alert = driver.SwitchTo().Alert()
					
							'confirmのテキストを取得
							MsgBox(alert.Text)
					
							'キャンセルボタンを押す
							alert.Dismiss()
					
							'------------------------
							'prompt表示
							CType(driver, IJavaScriptExecutor).ExecuteScript("prompt('prompt表示 test');")
					
							'promptのオブジェクトを変数に格納
							alert = driver.SwitchTo().Alert()
					
							'メッセージ入力
							alert.SendKeys("test")
					
							'OKボタンを押す
							alert.Accept()
					
						End Sub				
					
						//下記コードの動作確認はテストページ(https://web.biz-prog.net/test/testpage.html)で
						private void btnAlert_Click(object sender, EventArgs e)
						{
							//------------------------
							//alert表示
							((IJavaScriptExecutor)driver).ExecuteScript("alert('alert test');");
				
							//alertのオブジェクトを変数に格納
							IAlert alert = driver.SwitchTo().Alert();
				
							//alertのテキストを取得
							MessageBox.Show(alert.Text);
				
							//OKボタンを押す
							alert.Accept();
				
							//------------------------
							//confirm表示
							((IJavaScriptExecutor)driver).ExecuteScript("confirm('confirm test');");
				
							//confirmのオブジェクトを変数に格納
							alert = driver.SwitchTo().Alert();
				
							//confirmのテキストを取得
							MessageBox.Show(alert.Text);
				
							//キャンセルボタンを押す
							alert.Dismiss();
				
							//------------------------
							//prompt表示
							((IJavaScriptExecutor)driver).ExecuteScript("prompt('prompt表示 test');");
				
							//promptのオブジェクトを変数に格納
							alert = driver.SwitchTo().Alert();
				
							//メッセージ入力
							alert.SendKeys("test");
				
							//OKボタンを押す
							alert.Accept();
						}
					
						#下記コードの動作確認はテストページ(https://web.biz-prog.net/test/testpage.html)で
						from selenium import webdriver
						from selenium.webdriver.common.by import By
						from selenium.webdriver.support.ui import WebDriverWait
						from selenium.webdriver.support import expected_conditions as EC
						
						#Chromeブラウザを表示(環境変数のPATHにドライバーのパスを追加済とする)
						driver = webdriver.Chrome()
						
						#ページを表示
						driver.get("https://web.biz-prog.net/test/testpage.html")
						
						#------------------------
						#alert表示
						driver.execute_script("alert('alert test');")
						 
						#alertのオブジェクトを変数に格納
						alert = WebDriverWait(driver, 3).until(EC.alert_is_present())
						 
						#alertのテキストを取得
						print(alert.text)
						 
						#OKボタンを押す
						alert.accept()
						
						#------------------------
						#confirm表示
						driver.execute_script("confirm('confirm test');")
						 
						#confirmのオブジェクトを変数に格納
						alert = WebDriverWait(driver, 3).until(EC.alert_is_present())
						 
						#confirmのテキストを取得
						print(alert.text)
						 
						#キャンセルボタンを押す
						alert.dismiss()
						
						#------------------------
						#prompt表示
						driver.execute_script("prompt('prompt表示 test');");
						 
						#promptのオブジェクトを変数に格納
						alert = alert = WebDriverWait(driver, 3).until(EC.alert_is_present())
						 
						#メッセージ入力
						alert.send_keys("test")
						 
						#OKボタンを押す
						alert.accept()
					
						Sub Alert()

							'Chromeブラウザを表示
							Dim driver As New Selenium.chromeDriver
							Call driver.Start
						
							'ページを表示
							driver.Get ("https://web.biz-prog.net/test/testpage.html")
						
							'------------------------
							'alert表示
							driver.ExecuteScript ("alert('alert test');")
						
							'alertのオブジェクトを変数に格納
							Dim alert As alert
							Set alert = driver.SwitchToAlert()
						
							'alertのテキストを取得
							MsgBox (alert.Text)
						
							'OKボタンを押す
							alert.Accept
							driver.Wait (1000)
							
							'------------------------
							'confirm表示
							driver.ExecuteScript ("confirm('confirm test');")
						
							'confirmのオブジェクトを変数に格納
							Set alert = driver.SwitchToAlert()
						
							'confirmのテキストを取得
							MsgBox (alert.Text)
						
							'キャンセルボタンを押す
							alert.Dismiss
							driver.Wait (1000)
						
							'------------------------
							'prompt表示
							driver.ExecuteScript ("prompt('prompt表示 test');")
						
							'promptのオブジェクトを変数に格納
							Set alert = driver.SwitchToAlert()
						
							'メッセージ入力
							alert.SendKeys "test"   '機能しない
						
							'OKボタンを押す
							alert.Accept
						
						End Sub
					

参考

JavaScriptのアラート、プロンプト、確認ダイアログ

JavaScriptの実行

表示しているページに対してJavaScriptのコードを実行することができます。
Selenium単体では行えない操作も、JavaScriptを使用することで行えます。

VBやC#では、
((IJavaScriptExecutor)driver).ExecuteScriptメソッドの引数にJavaScriptのコードを指定します。
非同期用実行用の((IJavaScriptExecutor)driver).ExecuteAsyncScriptメソッドも使用できます。
Pythonでは、
driver.execute_scriptメソッドの引数にJavaScriptのコードを指定します。

プログラムで取得していた要素のオブジェクトを、JavaScriptのコードに渡すこともできます。
例えばelement変数に要素のオブジェクトを取得していた場合に、JavaScriptのコードにarguments[0]と記載すれば、その部分がelementのオブジェクトに置き換わります。

//VB書式
Dim element = driver.FindElement(By.Id("inputid2"))
CType(driver, IJavaScriptExecutor).ExecuteScript("alert(arguments[0].value);", element)

JavaScriptの実行結果やページの情報を取得したい場合は、JavaScriptのコードで値をreturnすれば、ExecuteScriptメソッドの戻り値として返却されます。

サンプルコード

						'下記コードの動作確認はテストページ(https://web.biz-prog.net/test/testpage.html)で
						Private Sub btnAttr_Click(sender As Object, e As EventArgs) Handles btnAttr.Click
					
							'文字のスタイル内容を表示
							CType(driver, IJavaScriptExecutor).ExecuteScript("document.getElementById('styleid1').setAttribute('info', 'newinfo');")
							CType(driver, IJavaScriptExecutor).ExecuteScript("alert(document.getElementById('styleid1').getAttribute('info'));")
					
						End Sub

						'VB/C#で取得した要素をJavaScriptに渡す
						Private Sub btnJs2_Click(sender As Object, e As EventArgs) Handles btnJs.Click
							
							Dim element = driver.FindElement(By.Id("inputid2"))
							CType(driver, IJavaScriptExecutor).ExecuteScript("alert(arguments[0].value);", element)
					
						End Sub

						'非同期のコード
						Private Async Sub btnAttr2_Click(sender As Object, e As EventArgs) Handles btnAttr.Click
					
							'文字のスタイル内容を表示
							Await CType(driver, IJavaScriptExecutor).ExecuteScript("document.getElementById('styleid1').setAttribute('info', 'newinfo');")
							'CType(driver, IJavaScriptExecutor).ExecuteScript("alert(document.getElementById('styleid1').getAttribute('info'));")
					
						End Sub	

						'JavaScriptの実行結果の値を取得
						Private Sub btnJs_Click(sender As Object, e As EventArgs) Handles btnJs.Click
							
							Dim result As String = CType(CType(driver, IJavaScriptExecutor).ExecuteScript("return 'test';"), String)
							MsgBox(result)
					
						End Sub
					
						//下記コードの動作確認はテストページ(https://web.biz-prog.net/test/testpage.html)で
						private void btnAttr_Click(object sender, EventArgs e)
						{
							//文字のスタイル内容を表示
							((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('styleid1').setAttribute('info', 'newinfo');");
							((IJavaScriptExecutor)driver).ExecuteScript("alert(document.getElementById('styleid1').getAttribute('info'));");
						}

						//VB/C#で取得した要素をJavaScriptに渡す
						private void btnJS_Click(object sender, EventArgs e)
						{
							var element = driver.FindElement(By.Id("inputid2"));
							((IJavaScriptExecutor)driver).ExecuteScript("alert(arguments[0].value);", element);
						}

						//非同期のコード
						private async void btnAttr_Click(object sender, EventArgs e)
						{
							//文字のスタイル内容を表示
							await ((IJavaScriptExecutor)driver).ExecuteScript("document.getElementById('styleid1').setAttribute('info', 'newinfo');");
							//((IJavaScriptExecutor)driver).ExecuteScript("alert(document.getElementById('styleid1').getAttribute('info'));");
						}

						//JavaScriptの実行結果の値を取得
						private void btnJS2_Click(object sender, EventArgs e)
						{
							string result = ((IJavaScriptExecutor)driver).ExecuteScript("return 'test';").ToString();
							MessageBox.Show(result);
						}
					
						#文字のスタイル内容を表示
						driver.execute_script("document.getElementById('styleid1').setAttribute('info', 'newinfo');")
						driver.execute_script("alert(document.getElementById('styleid1').getAttribute('info'));")
						
						#取得した要素をJavaScriptに渡す
						element = driver.find_element(By.ID, "inputid2")
						element.send_keys('input test');
						driver.execute_script("alert(arguments[0].value);", element)
						
						#JavaScriptの実行結果の値を取得
						result = driver.execute_script("return 'test';")
						print(result)
					
						'JavaScriptの実行
						Sub Attr()
						
							'Chromeブラウザを表示
							Dim driver As New Selenium.chromeDriver
							Call driver.Start
						
							'ページを表示
							driver.Get ("https://web.biz-prog.net/test/testpage.html")
							
							'文字のスタイル内容を表示
							driver.ExecuteScript ("document.getElementById('styleid1').setAttribute('info', 'newinfo');")
							driver.ExecuteScript ("alert(document.getElementById('styleid1').getAttribute('info'));")
						
						End Sub
						
						'VBAで取得した要素をJavaScriptに渡す
						Sub JS2()
						
							'Chromeブラウザを表示
							Dim driver As New Selenium.chromeDriver
							Call driver.Start
						
							'ページを表示
							driver.Get ("https://web.biz-prog.net/test/testpage.html")
							
							'VBAで取得した要素をJavaScriptに渡す
							Dim element As WebElement
							Set element = driver.FindElementById("inputid2")
							driver.ExecuteScript "alert(arguments[0].value);", element
						
						End Sub
						
						'JavaScriptの実行結果の値を取得
						Sub JS3()
						
							'Chromeブラウザを表示
							Dim driver As New Selenium.chromeDriver
							Call driver.Start
						
							'ページを表示
							driver.Get ("https://web.biz-prog.net/test/testpage.html")
							
							'JavaScriptの実行結果の値を取得
							Dim result As String
							result = driver.ExecuteScript("return 'test';")
							MsgBox (result)
						 
						End Sub
					

注意

alertのJavaScriptを実行する場合は注意が必要です。
alertでアラートと表示して閉じないまま、さらにalertの表示を行うと、例外が発生します。
また、非同期メソッドのExecuteAsyncScriptalertのJavaScriptを実行すると、処理が止まってしまいました。

参考

スクリプトの実行

終了処理

プログラムで作成したウィンドウを閉じる場合、「Close」メソッドを使用します。(手で作成したタブはそのまま残る)
プログラムで作成したウィンドウを閉じる(手で作成したタブも含む)場合、「Quit」メソッドを使用します。

						driver.Close
						driver.Quit
					
						driver.Close();
						driver.Quit();
					
						driver.close()
						driver.quit()
					
						driver.Close
						driver.Quit