Id/xpathを使用してチェックボックスをチェックするにはどうすればよいですか。ドロップダウン用の可視テキストによる選択に似た方法はありますか。
他のすべての関連する質問に与えられた例を調べてみると、簡単な方法で機能する適切な解決策を見つけることができませんでした。数行または方法でチェックボックスまたはラジオボタンをチェックできます。
任意の助けをいただければ幸いです。
サンプルのHTMLセクションは次のとおりです。
<tbody>
<tr>
<td>
<span class="120927">
<input id="ctl00_CM_ctl01_chkOptions_0" type="checkbox" name="ctl00$CM$ctl01$chkOptions$0"/>
<label for="ctl00_CM_ctl01_chkOptions_0">housingmoves</label>
</span>
</td>
</tr>
<tr>
<td>
<span class="120928">
<input id="ctl00_CM_ctl01_chkOptions_1" type="checkbox" name="ctl00$CM$ctl01$chkOptions$1"/>
<label for="ctl00_CM_ctl01_chkOptions_1">Seaside & Country Homes</label>
</span>
</td>
</tr>
</tbody>
チェックボックスを選択することは、ボタンをクリックすることに似ています。
driver.findElement(By.id("idOfTheElement")).click();
しましょう。
ただし、チェックボックスがすでにオンになっているかどうかも確認できます。次のスニペットは、チェックボックスが選択されているかどうかを確認します。選択されていない場合は、選択します。
if ( !driver.findElement(By.id("idOfTheElement")).isSelected() )
{
driver.findElement(By.id("idOfTheElement")).click();
}
私はこの質問が数ヶ月であったことを認識していますが、私はそれを見つけたばかりで、同じ問題にぶつかり、解決策を見つけました。 IEドライバーは、他のドライバーと同じようにすべてと対話するわけではないようで、チェックボックスはそのようなケースの1つです。
チェックボックスを使用するコツは、C#のように、クリックを使用する代わりにスペースキーを送信することです(IEでのみ必要)。
if (driver.Capabilities.BrowserName.Equals(“internet Explorer"))
driver.findElement(By.id("idOfTheElement").SendKeys(Keys.Space);
else
driver.findElement(By.id("idOfTheElement").Click();
すべてのチェックボックスを一度にクリックする場合、次のような方法で行います。
private void ClickAllCheckboxes()
{
foreach (IWebElement e in driver.FindElements(By.xpath("//input[@type='checkbox']")))
{
if(!e.Selected)
e.Click();
}
}
C#のソリューション
try
{
IWebElement TargetElement = driver.FindElement(By.XPath(xPathVal));
if (!TargetElement.Selected)
{
TargetElement.SendKeys(Keys.Space);
}
}
catch (Exception e)
{
}
「海辺と田舎の家」のチェックボックスを取得するには、次のXPathを使用します。
//label[text()='Seaside & Country Homes']/preceding-sibling::input[@type='checkbox']
「housingmoves」のチェックボックスを取得するには、次のXPathを使用します。
//label[text()='housingmoves']/preceding-sibling::input[@type='checkbox']
ここでの原則は、必要なテキストを含むラベルを取得し、それからbeforeというラベルのチェックボックスを取得することです。これはHTMLのレイアウト方法のようです。
すべてのチェックボックスを取得するには、少し上から始めて作業を開始します。つまり、テーブルを取得し、スパン内のチェックボックスを取得します。
//table/descendant::span/input[@type='checkbox']
次のコードを使用できます。
List<WebElement> checkbox = driver.findElements(By.name("vehicle"));
((WebElement) checkbox.get(0)).click();
私のHTMLコードは次のとおりでした:
<.input type="checkbox" name="vehicle" value="Bike">I have a bike<br />
<.input type="checkbox" name="vehicle" value="Car">I have a car <br />
これは役立つはずです-
IWebElement elementToClick = driver.findElement(By.xpath(""//input[contains(@id, 'lstCategory_0')]"));
elementToClick.Click();
Idを渡すこともできます。可視テキストのようなものが必要な場合は、名前がある場合は、名前で「find element」を使用できます。
WebDriverとC#を使用したソリューションは次のとおりです。重要なアイデアは、ラベルの「for」属性からチェックボックスのIDを取得し、それを使用してチェックボックスを識別することです。
また、コードは、変更が必要な場合にのみチェックボックスの状態を設定します。
public void SetCheckboxStatus(string value, bool toCheck)
{
//get the label containing the checkbox state
IWebElement labelElement = this.Driver.FindElement(By.XPath(string.Format("//label[.='{0}']",value)));
string checkboxId = labelElement.GetAttribute("for");
IWebElement checkbox = this.Driver.FindElement(By.Id(checkboxId));
if (toCheck != checkbox.Selected)
{
checkbox.Click();
}
}
ステップ1:ここで使用されることになっているObject LocatorはXPathです。したがって、これら2つのチェックボックスのXPathを導出します。
String housingmoves="//label[contains(text(),'housingmoves')]/preceding-sibling::input";
String season_country_homes="//label[contains(text(),'Seaside & Country Homes')]/preceding-sibling::input";
ステップ2:
チェックボックスをクリックしてください
driver.findElement(By.xpath(housingmoves)).click();
driver.findElement(By.xpath(season_country_homes)).click();
さまざまなアプローチを試みましたが、何も機能しませんでした。 「要素をクリックできません」またはElementNotVisibleExceptionを取得し続けました。入力を見つけることができましたが、確認できませんでした。今、私はチェックボックスを含むdivをクリックしており、次のHTML(ブートストラップに基づくCSS)で動作します。
@foreach (var item in Model)
{
<tr>
<td>
<div id="@item.Id" class="checkbox">
<label><input type="checkbox" class="selectone" value="@item.Id"></label>
</div>
</td>
<td val="@item.Id">
@item.Detail
</td>
<td>
<div>@item.Desc
</div>
</td>
<td>
@Html.ActionLink("Edit", "Create", new { EditId = item.Id })
</td>
</tr>
}
これはWebDriverのコードです
var table = driver.FindElement(By.TagName("table"));
var tds = table.FindElements(By.TagName("td"));
var itemTds = tds.Where(t => t.Text == itemtocheck);
foreach (var td in itemTds)
{
var CheckBoxTd = tds[tds.IndexOf(td) - 1];
var val = td.GetAttribute("val");
CheckBoxTd.FindElement(By.Id(val)).Click();
}
このアプローチでは、アイテムIDをdivのidとして指定し、そのidを持つtdの属性も追加します。チェックする必要のあるアイテムのtdを見つけたら、そのtdの前のdivを見つけてクリックします。以前をサポートするxpathクエリを使用することもできます(例は http://learn-automation.com/how-to-write-dynamic-xpath-in-Selenium/ です)。
たぶん良い出発点:
isChecked = driver.findElement((By.id("idOftheElement"))).getAttribute("name");
if(!isChecked.contains("chkOptions$1"))
{
driver.FindElement(By.Id("idOfTheElement")).Click();
}
部分一致の場合は、次を実行します
getDriver().findElement(By.cssSelector("<tag name>[id*='id pattern to look for']")).click();
Scott Croweの回答のC#バージョンを以下に示します。 IEDriverとChromeDriverの両方が、チェックボックスをクリックする代わりにKey.Spaceの送信に応答することがわかりました。
if (((RemoteWebDriver)driver).Capabilities.BrowserName == "firefox")
{
// Firefox
driver.FindElement(By.Id("idOfTheElement")).Click();
}
else
{
// Chrome and IE
driver.FindElement(By.Id("idOfTheElement")).SendKeys(Keys.Space);
}
これについて正しい方向に送ってくれたScottに感謝します。
以下のコードは、最初にページに存在するすべてのチェックボックスを取得してから、すべてのチェックボックスを選択解除します。
List<WebElement> allCheckbox = driver.findElements(By
.xpath("//input[@type='checkbox']"));
for (WebElement ele : allCheckbox) {
if (ele.isSelected()) {
ele.click();
}
}
このアプローチを実行すると、実際にはチェックボックスが切り替わります。 Java/Selenium2の.isSelected()
は、明らかにfalse
[少なくとも私がテストしたJava/Selenium/Firefoxバージョンでは]を返します。
適切なチェックボックスの選択は問題のある場所ではありません-むしろ、それは初期状態を正しく区別することにあり、すでにチェックされているボックスの再クリックを不必要に避けます。
onchange
イベントによって要素を操作していたため、JavaScriptでチェックボックスをクリックできない場合がありました。
そして、その文は私が問題を許容するのに役立ちます:
driver.findElement(By.xpath(".//*[@id='theID']")).sendKeys(Keys.SPACE);
チェックボックスを選択するには、"WebElement"
クラスを使用します。ドロップダウンリストを操作するには、"Select"
クラスを使用します。