私のサイトには選択コントロールがあります。ページを操作するためにページオブジェクトを使用しています。もしそうなら(私のクラスの下の最初の2行と私のメソッドのselectByValue
で)
@FindBy(id="foo")
private Select foo;
foo.selectByValue("myValue");
Nullポインタで失敗します。私も@FindBy
なしで試しました。
私の方法でこれを行うと、すべて正常に動作し、正しいアイテムを選択します
Select foo = new Select(sDriver.findElement(By.id("foo")));
foo.selectByValue("myValue");
これがそのコントロールの実際のWebスニペットです(無実を保護するために編集されています)。
<select id="foo" name="service_name">
<option selected="selected" value="one">one</option>
<option value="two">two</option>
<option value="three">three</option>
</select>
私の問題に回避策があるとしましょうbut「normal」パスがなぜなのかわかりません機能していません。
これは、Select
クラスに次のコンストラクタがあるためです。
Select(WebElement element)
Javadoc を参照してください
したがって、次のようなことをすると:
@FindBy(id="foo")
private WebElement wannabeSelect;
Select realSelect = new Select(wannabeSelect);
realSelect.selectByValue("myValue");
うまくいくはずです。
ところで、私は「回避策」であなたと同じアプローチを使用しています。選択オブジェクトが必要なときに新しいWebElementオブジェクトをキャストしたくないからです。しかしとにかく、
sDriver.findElement(By.id("foo"));
WebElement
を返すので、そのように機能します。これを行うこともできます:
WebElement wannabeSelect = sDriver.findElement(By.id("foo"));
Select foo = new Select(wannabeSelect);
オプション値を選択する方法は2つあります。
1:
// Denotes option value - technical name
select.selectByValue(fieldValue);
二:
// Denotes option text that is actually visible to be selected
select.selectByVisibleText(fieldValue);
私がこれを達成した別の方法は、すべてのonchangeドロップダウン選択ボックスに以下のメソッドを使用することです。 IDと選択を渡すと機能します
public void onchangedropdownselection(String object, String value) {
driver.findElement(By.id(object)).sendKeys(value);
driver.findElement(By.id(object)).sendKeys(Keys.UP);
driver.findElement(By.id(object)).sendKeys(Keys.DOWN);
}
上下に移動することで、スクリプトonchangeを初期化しています。