selenium-webdriver
Web要素の検索
サーチ…
構文
- ByChained(params By [] bys)
備考
項目は、 ロケータとBy
クラスを使用してSeleniumで検出されます。 Seleniumで堅牢な自動化プロジェクトを作成するには、Web Elementsのロケータをスマートに使用する必要があります。ロケータは記述的で、ユニークで、変化する可能性は低いはずです。たとえば、テストで誤検出がないようにしてください。優先順位は次のものを使用することです。
- ID - それはユニークなので、あなたが望む要素を正確に得ることができます。
- クラス名 - それは記述的であり、与えられた文脈においてユニークであることができる。
- CSS ( xpathよりも優れたパフォーマンス ) - より複雑なセレクタ用。
- XPATH - CSSが使用できない場所( XPATHの軸 )。例えば
div::parent
。
残りのロケータは変更やレンダリングが発生しやすく、避けてください。
経験則:あなたのコードが特定の要素を見つけることができない場合、あなたのコードがダウンロードするすべてのDOM要素を待っていないことが原因の1つの理由があります。上記の要素を検索する前に、あなたのプログラムに短期間 "待機"(3〜5秒間試してから、必要に応じてゆっくりと増加)するように指示してください。以下は、 この質問から抜粋したPythonの例です:
from selenium import webdriver
import time
browser = webdriver.Firefox()
browser.get("https://app.website.com")
reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# Element not found! Try giving time for the browser to download all DOM elements:
time.sleep(10)
reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# This returns correct value!
WebDriverを使用したページ要素の検索
WebページでWebElementsとやりとりするには、まず要素の位置を特定する必要があります。
Byはセレンで利用可能なキーワードです。
あなたは、要素By ..を見つけることができます
- ID により、
- クラス名
- TagName により、
- 名前 で
- リンク・テキスト が
- 部分的なリンクテキスト で
- CSSセレクタ で
- XPathの ことで
- JavaScript を使用 する
以下のスクリプトの例を考えてみましょう
<form name="loginForm">
Login Username: <input id="username" name="login" type="text" />
Password: <input id="password" name="password" type="password" />
<input name="login" type="submit" value="Login" />
上記のコードでは、ユーザー名とパスワードはIDを使用して設定されています。今度はidを持つ要素を識別しようとしています。
driver.findElement(By.id(username));
driver.findElement(By.id(password));
セレンは7つの異なる言語をサポートしていますので、この文書ではすべての言語で要素を見つけるアイディアを示しています。
IDで
IDを使って要素を見つける方法の例:
<div id="coolestWidgetEvah">...</div>
Java - WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
C# - IWebElement element = driver.FindElement(By.Id("coolestWidgetEvah"));
Python - element = driver.find_element_by_id("coolestWidgetEvah")
Ruby - element = driver.find_element(:id, "coolestWidgetEvah")
JavaScript/Protractor - var elm = element(by.id("coolestWidgetEvah"));
クラス名で
クラス名を使用して要素を見つける方法の例:
<div class="cheese"><span>Cheddar</span></div>
Java - WebElement element = driver.findElement(By.className("cheese"));
C# - IWebElement element = driver.FindElement(By.ClassName("cheese"));
Python - element = driver.find_element_by_class_name("cheese")
Ruby - cheeses = driver.find_elements(:class, "cheese")
JavaScript/Protractor - var elm = element(by.className("cheese"));
タグ名による
タグ名を使って要素を見つける方法の例:
<iframe src="..."></iframe>
Java - WebElement element = driver.findElement(By.tagName("iframe"));
C# - IWebElement element = driver.FindElement(By.TagName("iframe"));
Python - element = driver.find_element_by_tag_name("iframe")
Ruby - frame = driver.find_element(:tag_name, "iframe")
JavaScript/Protractor - var elm = element(by.tagName("iframe"));
名前で
nameを使って要素を見つける方法の例:
<input name="cheese" type="text"/>
Java - WebElement element = driver.findElement(By.name("cheese"));
C# - IWebElement element = driver.FindElement(By.Name("cheese"));
Python - element = driver.find_element_by_name("cheese")
Ruby - cheese = driver.find_element(:name, "cheese")
JavaScript/Protractor - var elm = element(by.name("cheese"));
リンクテキスト
リンクテキストを使って要素を見つける方法の例:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
Java - WebElement element = driver.findElement(By.linkText("cheese"));
C# - IWebElement element = driver.FindElement(By.LinkText("cheese"));
Python - element = driver.find_element_by_link_text("cheese")
Ruby - cheese = driver.find_element(:link, "cheese")
JavaScript/Protractor - var elm = element(by.linkText("cheese"));
部分リンクテキスト
部分リンクテキストを使用して要素を見つける方法の例:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
Java - WebElement element = driver.findElement(By.partialLinkText("cheese"));
C# - IWebElement element = driver.FindElement(By.PartialLinkText("cheese"));
Python - element = driver.find_element_by_partial_link_text("cheese")
Ruby - cheese = driver.find_element(:partial_link_text, "cheese")
JavaScript/Protractor - var elm = element(by.partialLinkText("cheese"));
CSSセレクタによる
CSSセレクタを使って要素を見つける方法の例:
<div id="food" class="dairy">milk</span>
Java - WebElement element = driver.findElement(By.cssSelector("#food.dairy")); //# is used to indicate id and . is used for classname.
C# - IWebElement element = driver.FindElement(By.CssSelector("#food.dairy"));
Python - element = driver.find_element_by_css_selector("#food.dairy")
Ruby - cheese = driver.find_element(:css, "#food span.dairy.aged")
JavaScript/Protractor - var elm = element(by.css("#food.dairy"));
CSSセレクタの作成に関する記事は次のとおりです。http : //www.w3schools.com/cssref/css_selectors.asp
XPathによる
XPathを使用して要素を見つける方法の例:
<input type="text" name="example" />
Java - WebElement element = driver.findElement(By.xpath("//input"));
C# - IWebElement element = driver.FindElement(By.XPath("//input"));
Python - element = driver.find_element_by_xpath("//input")
Ruby - inputs = driver.find_elements(:xpath, "//input")
JavaScript/Protractor - var elm = element(by.xpath("//input"));
XPathに関する記事は次のとおりです。http : //www.w3schools.com/xsl/xpath_intro.asp
JavaScriptを使用する
任意のjavascriptを実行して要素を見つけることができます。また、DOM要素を返す限り、自動的にWebElementオブジェクトに変換されます。
jQueryが読み込まれたページの簡単な例:
Java - WebElement element = (WebElement)
((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
C# - IWebElement element = (IWebElement)
((IJavaScriptExecutor)driver).ExecuteScript("return $('.cheese')[0]");
Python - element = driver.execute_script("return $('.cheese')[0]");
Ruby - element = driver.execute_script("return $('.cheese')[0]")
JavaScript/Protractor -
注:特定のWebDriverがSimpleBrowserなどのJavaScriptをサポートしていない場合、この方法は機能しません。
複数の基準による選択[C#]
セレクタを一緒に使用することもできます。これは、 OpenQA.Selenium.Support.PageObjects.ByChained
オブジェクトを使用してOpenQA.Selenium.Support.PageObjects.ByChained
ます。
element = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));
任意の数のBy
連鎖させることができ、AND型の選択として使用されます(つまり、 By
はすべて一致します)
ページの読み込みが停止する前に要素を選択する
driver.Navigate().GoToUrl(url);
呼び出すときdriver.Navigate().GoToUrl(url);
、ページが完全にロードされるまでコードの実行が停止します。これは、データを抽出するだけの場合には不要なことがあります。
注:以下のコードサンプルはハックと見なすことができます。これを行う "公式の"方法はありません。
新しいスレッドを作成する
Webページを読み込むスレッドを作成して起動し、 Waitを使用します。
C#
using (var driver = new ChromeDriver())
{
new Thread(() =>
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
}).Start();
new WebDriverWait(driver, TimeSpan.FromSeconds(10))
.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='summary']/h3/a")));
}
タイムアウトを使用する
WebDriverTimeoutを使用すると、ページを読み込むことができます。一定時間が経過すると例外がスローされ、ページの読み込みが停止します。 catchブロックでは、 Waitを使用できます。
C#
using (var driver = new ChromeDriver())
{
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5));
try
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
}
catch (WebDriverTimeoutException)
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10))
.Until(ExpectedConditions.ElementIsVisible
(By.XPath("//div[@class='summary']/h3/a")));
}
}
問題 :タイムアウトを短すぎる時間に設定すると、目的の要素が存在するかどうかに関係なく、ページの読み込みが停止します。タイムアウトを長すぎる時間に設定すると、パフォーマンスのメリットを無効にします。