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プロパティへの設定
GoToUrlメソッド
driver.Navigate().GoToUrl("https://www.yahoo.co.jp")
driver.Navigate().GoToUrl("https://www.yahoo.co.jp");
getメソッド
読み込み待ち
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を一度設定しておけば、以降の
FindElementやFindElementsで要素を取得するときに、毎回待機が行われるようになります。
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
戻る/進む/更新
タイトル/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()でダイアログのオブジェクトを取得でき、AcceptやDismissでボタンを押下します。
'下記コードの動作確認はテストページ(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のコードを実行することができます。
Selenium単体では行えない操作も、JavaScriptを使用することで行えます。
VBやC#では、
((IJavaScriptExecutor)driver).ExecuteScriptメソッドの引数にJavaScriptのコードを指定します。
非同期用実行用の((IJavaScriptExecutor)driver).ExecuteAsyncScriptメソッドも使用できます。
Pythonでは、
driver.execute_scriptメソッドの引数にJavaScriptのコードを指定します。
プログラムで取得していた要素のオブジェクトを、JavaScriptのコードに渡すこともできます。
例えばelement変数に要素のオブジェクトを取得していた場合に、JavaScriptのコードにarguments[0]と記載すれば、その部分がelementのオブジェクトに置き換わります。
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の表示を行うと、例外が発生します。また、非同期メソッドの
ExecuteAsyncScriptでalertのJavaScriptを実行すると、処理が止まってしまいました。