handling iframes using selenium webdriver switchto method
任意のウェブサイトからビデオをダウンロードするためのソフトウェア
Selenium WebDriverを使用したiFrameの処理:実用的な例を使用した実践的なチュートリアル
iFrame(インラインフレーム)は、別のHTMLドキュメント内に埋め込まれたHTMLドキュメントです。
iFrameは、Webページ内に広告を表示するために最も一般的に使用されます。 iFrameは、HTMLタグを使用してHTMLドキュメントで明示的に言及されます
このチュートリアルでは、Seleniumでのiframeの処理についてすべて説明し、理解しやすいように関連するコード例を示します。
=> EasySeleniumトレーニングシリーズをお読みください。
学習内容:
Seleniumを使用したiFrameの処理
以下に示すように、「このフレーム」という名前のオプションが右クリックオプションに表示されている場合、Webページ内のiframeはFirefoxブラウザで識別できます。
または、ソースコードを確認してタグを検索することで、ウェブページにiframeがあるかどうかを検証することもできます。
List iframes = driver.findElements(By.tagName(“iframe”));
iFrameを処理するためにSeleniumが提供するメソッド
Seleniumには、iframeから切り替えるための次の組み込みメソッドが用意されています。
- switchTo.frame(int frameNumber)
- switchTo.frame(string frameName)
- switchTo.frame(WebElement frameElement)
- switchTo()。defaultContent()
#1)switchTo.frame(int frameNumber)
- このメソッドを使用すると、ユーザーはフレームIDを使用して特定のフレームに切り替えることができます。
- フレーム番号はゼロベースのインデックス値です。つまり、Webページの最初のフレームのインデックスは0、2番目のフレームのインデックスは1、3番目のフレームのインデックスは3というようになります。
- フレーム番号は、要素のフレームIDを使用して識別することもできます。これはによって行うことができます 右クリック->要素の検査とiFrameの検索。 いずれかのiFrameにID属性があるかどうかを検証します。
ソースコードのサンプルiframe要素は次のようになります。
iFrameのIDが特定されたら、それを使用して以下のようにフレームに切り替えることができます。
例:
driver.switchTo.frame( 'a077aa5e');
driver.switchTo.frame(0);
- このメソッドは、必要なフレームが現在のWebページに見つからない場合、NoSuchFrameExceptionをスローします。
#2)switchTo.frame(string frameName)
- このメソッドを使用すると、ユーザーは開発者が定義したフレームの名前を使用して特定のフレームに切り替えることができます。
- フレーム名を文字列パラメータと見なすには、フレーム名を二重引用符で囲む必要があります。
- このメソッドは、必要なフレームが現在のWebページに見つからない場合、NoSuchFrameExceptionをスローします。
例:
上記のコードでは、フレームIDとフレーム名の両方が同じ値を保持しています。フレームへの切り替えは、以下のようにフレーム名を使用して実行できます。
driver.switchTo.frame( 'a077aa5e');
#3)switchTo.frame(WebElement frameElement)
- この方法により、ユーザーはWeb要素の場所に基づいてフレームに切り替えることができます。
- このメソッドは、必要なフレームがWebページに存在しない場合はNoSuchFrameExceptionをスローし、Webページに表示されるフレームがアクティブでない場合はStaleElementReferenceExceptionをスローします。
例:
WebElement frameElement = driver.findElement(By.id(“ a077aa5e”));
driver.switchTo.frame(frameElement);
#4)switchTo()。defaultContent()
- iframeと親ページを切り替えるには、driver.switchTo()。defaultContent()メソッドを使用します。
- Seleniumには、driver.switchTo()。parentFrame()メソッドという名前のフレームを切り替える同様のメソッドがあることに注意してください。
- driver.switchTo()。defaultContent()とdriver.switchTo()。parentFrame()の違いは、最初のメソッドはWebページ内のフレーム数に関係なく、コントロールをメインのWebページに切り替えるのに対し、2番目のメソッドはコントロールを切り替えることです。コントロールを現在のフレームの親フレームに切り替えます。
例:
親Webページp1内にi1、i2、およびi3という名前の3つのフレームがあるとします。フレームi1、i2、およびi3は相互に依存しています。つまり、1つのフレームが別のフレームの親になります。
フレームi3でdriver.switchTo()。defaultContent()メソッドを使用すると、Webドライバーコントロールは親ページp1に移動します。一方、フレームi3のdriver.switchTo()。parentFrame()メソッドは、コントロールをフレームi2に戻します。
ソースコードサンプル:
以下は、セレンのiframeを使用して自動化されるテストシナリオです。
- SoftwareTestingHelp.comWebサイトを開きます。
- タグiframeを持つすべてのHTML要素を検索し、iFrameの出現回数をカウントして、コンソールに出力します。
- フレームIDを使用してWebページ上の有効なフレームに切り替え、フレームのソースコードを印刷します。
- 現在のブラウザウィンドウを閉じます。
package Demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class iFramesDemo { public static void main(String() args) throws InterruptedException { System.setProperty('webdriver.gecko.driver','D:\Data_Personal\Demo \geckodriver-v0.23.0-win64\geckodriver.exe'); WebDriver driver = new FirefoxDriver(); driver.get('https://www.softwaretestinghelp.com/'); //Finding all iframe tags on a web page List elements = driver.findElements(By.tagName('iframe')); int numberOfTags = elements.size(); System.out.println('No. of Iframes on this Web Page are: ' +numberOfTags); // Switch to the frame using the frame id System.out.println('Switching to the frame'); driver.switchTo().frame('aswift_0'); // Print the frame source code System.out.println('Frame Source' +driver.getPageSource()); // Switch back to main web page driver.switchTo().defaultContent(); driver.quit(); } }
コード出力:
ウェブサイトを開きます:https://www.softwaretestinghelp.com
aswift_0という名前のフレームに切り替えます。
日食コンソールウィンドウのWebページにiframeの数を印刷します。
フレームに切り替えた後、Eclipseコンソールでフレームのソースコードを印刷します。
コードの説明:
- System.setPropertyメソッドを使用してgeckoドライバーのオブジェクトを初期化し、ローカルマシン上のgeckodriver.exeファイルパスをポイントします。
- 次に、WebDriverインターフェイスを介してFireFoxドライバーのオブジェクトをインスタンス化します。
- Firefoxドライバーオブジェクトを使用して、次のWebページを開きます:https://www.softwaretestinghelp.com。
- 次のステップでは、Webページに表示されるiframe要素の数を特定し、それらをカウントして、Eclipseコンソールにiframeカウントを表示します。
- フレームIDを使用して、Webページのフレームに切り替えます。上記の場合、フレームIDは「aswift_0」です。
- フレームへの切り替えが正常に完了すると、フレームのソースコードがEclipseコンソールに出力されます。
- 次に、driver.switchTo()。defaultContent()ステートメントを使用して親Webページに戻り、最後にdriver.quitメソッドを使用してWebドライバーインスタンスを閉じます。
SeleniumのFrameとiFrameの違い
- フレームは、ページを複数のセクションに分割するために使用され、各セクションに新しいコンテンツがあります。
- クロスサイトスクリプティングの問題を回避するために、iFrameを使用して外部WebサイトのコンテンツをWebページに埋め込みます。
- iFrameを使用すると、開発者はサードパーティのWebサイトのコンテンツを埋め込むことができるため、iFrameはフレームよりも安全性が低いと見なされます。したがって、iframeでは、開発者がiframeに埋め込んだコンテンツを信頼する必要があります。
- 現在開発されているほとんどのWebアプリケーションは、フレームを使用してページを分割するのではなく、iframeを使用して広告などの外部コンテンツをWebページに埋め込みます。
Seleniumでの動的フレームの処理
- 一部のWebページでは、フレームIDやフレーム名などのフレームプロパティがWebページ上で動的に変更される場合がありますが、フレームの位置は同じままです。このような場合、フレームを一意に識別するためにフレームIDまたはフレーム名に依存することはできません。
- 使用できます フレームインデックス このような場合、フレームの位置に基づいてフレームを一意に識別します。
- 場合によっては、フレームID値はページが読み込まれるたびに変更されますが、静的テキストは変更されません。 例えば 、iframeの以下のコードを検討してください。
上記の例では、テキスト「frame_」は一定のままですが、数値はページが読み込まれるたびに変化します。
- 以下を使用して、上記のフレームを一意に識別できます XPath
// iframe (contains(@ id、 ’frame’))
2020年3月の更新
フレーム内の要素を見つける方法
Seleniumでは、フレーム内に存在する要素にアクセスするために、最初にフレーム内で切り替えてから、さまざまなSeleniumロケーターを使用して通常行うように要素を識別する必要があります。 Seleniumコードは、IFrameに切り替えないと、要素を見つけることができません。
以下のスクリーンショットは、フレームがHTMLコードに埋め込まれる方法を示しています。
Seleniumを使用してIFrameに切り替えるさまざまな方法
#1)フレーム名またはIDを使用する
フレーム名またはフレームIDを使用してIFrameに切り替えます。フレーム名またはID、あるいはその両方がコードに含まれる場合があります。
構文:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
#2)フレームインデックスの使用
可能な場合は、フレームインデックスを使用してフレームを見つけます。
構文:
driver.switchTo().frame(0); // frame index starts with 0
#3)Web要素の使用
Seleniumロケーターを使用してフレームを見つけます 。
構文:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
フレームを使用したその他の操作
#1)親フレームまたは祖先フレームに切り替える
「switchTo.parentFrame」コマンドを使用して、フレーム3からフレーム2に切り替えます。 。
構文:
driver.switchTo().parentFrame();
#2)他のフレームへの切り替え
フレーム3からフレーム1またはデフォルトのフレームに切り替える場合は、「switchTo.defaultContent」コマンドを使用します。
構文:
driver.switchTo().defaultContent();
以下のコードでは、フレーム内にある名前テキストボックスを見つけています。
フレームに切り替えずに直接見つけようとするとどうなりますか?
結果を見てみましょう:
「要素が見つかりません:{'method': 'xpath'、 'selector': '// input (@ name = ’name’)”}という理由でコードが失敗しました
次に、Web Elementを使用してフレーム内を切り替えるか、Seleniumロケーターを使用してテキストボックスフィールドを見つけます。
以下に、フレーム内で切り替えるための完全なコードを示します。
package com.wordpress.pages; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Frame { static WebDriver driver; @Test public void Test(){ System.setProperty('webdriver.chrome.driver', 'D:\Srinivas\New folder\exe\chromedriver.exe'); driver = new ChromeDriver(); driver.get('http://www.dwuser.com/education/content/the-magical-iframe-tag-an-introduction/'); //identifying the frame using locator or say using webelement driver.switchTo().frame(driver.findElement(By.xpath('//div(@id='eduFooterWrap')//iframe(1)'))); driver.findElement(By.xpath('//input(@name='name')')).sendKeys('SoftwareTestingHelp.com'); } }
出力:
これは、Seleniumを使用して要素を見つけるためにフレームを切り替える必要がある方法です。 Webページに複数のフレームがある場合は、複数回切り替える必要があります。
結論
- iFrameは、別のHTMLドキュメントに埋め込まれたHTMLドキュメントです。 iFrameは、HTMLタグを使用してHTMLドキュメントで明示的に言及されます
- switchTo.frame(int frameNumber)メソッドを使用すると、ユーザーはフレームIDを使用して特定のフレームに切り替えることができます。
- switchTo.frame(string frameName)メソッドを使用すると、ユーザーは開発者が定義したフレームの名前を使用して特定のフレームに切り替えることができます。
- switchTo.frame(WebElement frameElement)メソッドを使用すると、ユーザーはWeb要素の場所に基づいてフレームに切り替えることができます。
=> ここですべてのSeleniumチュートリアルを確認してください。
推奨読書
- Cucumber Seleniumチュートリアル:Cucumber Java SeleniumWebDriverの統合
- Selenium WebDriverの概要– Seleniumチュートリアル#8
- 最初のWebDriverスクリプトの実装– Selenium WebDriverチュートリアル#10
- Seleniumに関するFAQ
- Selenium WebDriverでアラート/ポップアップを処理する方法-Seleniumチュートリアル#16
- SeleniumスクリプトでのWebテーブル、フレーム、および動的要素の処理– Seleniumチュートリアル#18
- Selenium WebDriverでの暗黙的および明示的な待機(Selenium待機のタイプ)
- SeleniumWebDriverでエクステントレポートを生成するためのガイド