WebDriverのSelenium.focus()
と同等のものは何ですか?
element.sendKeys("");
または
new Actions(driver).moveToElement(element).perform();
私はそれらの両方を試しましたが、彼らは働きましたが、どちらが常にすべての要素に取り組むでしょうか?
要素(ボタン、リンクなど)の正しい方法はどれですか?この関数は異なるUIで使用されるため、これは私にとって重要です。
次のコード-
element.sendKeys("");
入力タグボックスを見つけて情報を入力しようとしますが、
new Actions(driver).moveToElement(element).perform();
画像要素、リンク要素、ドロップダウンボックスなどで機能するため、より適切です。
したがって、moveToElement()メソッドを使用すると、Webページ上のすべての汎用WebElementに焦点を当てることがより理にかなっています。
入力ボックスの場合、フォーカスする要素をclick()する必要があります。
new Actions(driver).moveToElement(element).click().perform();
リンクと画像の場合、マウスはその特定の要素の上にありますが、やりたいことに応じてclick()することを決定できます。
入力タグのclick()が機能しない場合-
この関数を汎用にしたいので、まずwebElementが入力タグであるかどうかを確認します-
if("input".equals(element.getTagName()){
element.sendKeys("");
}
else{
new Actions(driver).moveToElement(element).perform();
}
設定に基づいて同様の変更を行うことができます。
以下のようにJSを使用できます。
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");
フォーカスは、ウィンドウがフォーカスされている場合にのみ機能します。
((JavascriptExecutor)webDriver).executeScript("window.focus();");
を使用して確認してください。
FWIW、関連する問題だと思うものがあり、回避策を考え出しました:document.execCommand( 'paste')を実行するChrome Extensionを、ウィンドウのアンロードに焦点を合わせて順番にテキストエリアに書き込みました要素にシステムクリップボードの内容を入力します。これは100%の時間手動で機能しましたが、execCommandはSeleniumで実行されるとほぼ常にfalseを返しました。
最初のdriver.get(myChromeExtensionURL)の後にdriver.refresh()を追加しましたが、今では100%動作します。これは、Mac OS 10.9上のSeleniumドライバーバージョン2.16.333243およびChromeバージョン43でのものでした。
私が問題を調査していたとき、この回避策についての言及は見られなかったので、Selenium/focus/execCommand( 'paste')の足跡でフォローしている人の発見を文書化すると思いました。
このコードは実際にはフォーカスを提供しません:
new Actions(driver).moveToElement(element).perform();
ホバー効果を提供します。
さらに、JSコード.focus()を使用するには、ウィンドウをアクティブにする必要があります。
js.executeScript("element.focus();");
私はこのコードが機能することを発見しました:
element.sendKeys(Keys.SHIFT);
自分のコードでは、両方を使用します。
element.sendKeys(Keys.SHIFT);
js.executeScript("element.focus();");
以下のコードを使用してwebelementにフォーカスすることもできます。
public focusElement(WebElement element){
String javaScript = "var evObj = document.createEvent('MouseEvents');"
+ "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);"
+ "arguments[0].dispatchEvent(evObj);";
((JavascriptExecutor) getDriver()).executeScript(javaScript, element);
}
それが役に立てば幸い :)