IE9でIEドライバーを使用する場合、Clickメソッドはボタンを選択するだけの場合があり、Click()のアクションを実行しない場合があります。 Firefox4でFirefoxドライバーを使用しても問題はありません。要素がときどき見つからないという問題もありますが、IE Firefox。
if (Driver.FindElement(By.Name("username")) == null) {
//sometimes gets here in IE, never gets here in Firefox
}
Driver.FindElement(By.Name("username")).SendKeys(username);
Driver.FindElement(By.Name("surname")).SendKeys(surname);
Driver.FindElement(By.Name("firstname")).SendKeys(firstname);
string url = Driver.Url;
Driver.FindElement(By.Name("cmd")).Click();
if (Driver.Url == url) {
//if the page didnt change, click the link again
Driver.FindElement(By.Name("cmd")).Click();
}
私はこの同様の質問を見てきました(http://stackoverflow.com/questions/4737205/Selenium-webdriver-ie-button-issue)が、動的に生成されたIDがありません。
.Click()
を使用してリンクをクリックしようとすると、Internet Explorer 8で同じことを発見しました-リンクをクリックするSeleniumを見ることができます。私の経験から、ブラウザにフォーカスがない場合、最初のクリックは機能しないようです。
これを回避するには、リンクをクリックする前にブラウザがフォーカスを取得できるように、ページ上の別の要素に.Click()
を送信します。それは親です:
Driver.FindElement(By.Id("Logout")).FindElement(By.XPath("..")).Click();
Driver.FindElement(By.Id("Logout")).Click();
IEドライバにバグがあり、同じバージョンのコードは、同じバージョンのIEを搭載した異なるマシンで異なる動作をします。
各アクションの前に一貫して取得するために、私は次のことを行います。
driver.SwitchTo().Window(driver.CurrentWindowHandle);//Force Focus
私にとって、これはIEドライバーが期待どおりに動作するようにします。
同じ問題が発生した場合、クリックはIEで機能しません。クリックを実行するためにDriver.FindElement(By.Name( "..."))。sendKeys( "\ n")を実行する回避策を見つけました(基本的には、ボタンでEnterキーを押すだけです)。あまりきれいではありませんが、問題が修正されるまで動作します!
プロジェクトでSelenium WebDriver 2.15.0を参照し、Selenium WebDriver Server 2.16.0を使用してソリューションをリファクタリングし、次のことを確認しました。
FirefoxDriver
を使用すると、クリックイベントdoesが正しく起動します。DesiredCapabilities.Firefox
にRemoteWebDriver
を使用すると、特定のコントロールに対して正しく起動しますDesiredCapabilities.HtmlUnit
およびDesiredCapabilities.HtmlUnitWithJavaScript
にRemoteWebDriver
を使用すると、クリックイベントdoesが正しく起動します。InternetExplorerDriver
とDesiredCapabilities.InternetExplorer
を含むRemoteWebDriver
(実際には同じこと)によって、一貫性のない結果が得られ、特定するのが難しいと感じています。最初の3つのポイントに対する私のソリューションは、RemoteWebDriver
およびRemoteWebElement
を拡張する独自のクラスを作成して、IRemoteWebDriver
およびIWebElement
を参照し続けるテストコードからカスタム動作を隠すことができるようにすることです。
現在の「微調整」は下にありますが、これらのカスタムクラスを使用すると、テストコードを変更することなく、ドライバーとWeb要素の動作を思いのままに調整できます。
public class MyRemoteWebDriver : RemoteWebDriver
{
//Constructors...
protected override RemoteWebElement CreateElement(string elementId)
{
return new MyWebElement(this, elementId);
}
}
public class MyWebElement : RemoteWebElement, IWebElement
{
//Constructor...
void IWebElement.Click()
{
if (Settings.Default.WebDriver.StartsWith("HtmlUnit"))
{
Click();
return;
}
if (TagName == "a")
{
SendKeys("\n");
Thread.Sleep(100);
return;
}
if (TagName == "input")
{
switch (GetAttribute("type"))
{
case "submit":
case "image":
Submit();
return;
case "checkbox":
case "radio":
//Send the 'spacebar' keystroke
SendKeys(" ");
return;
}
}
//If no special conditions are detected, just run the normal click
Click();
}
}
上記の解決策はどれも私にとってはうまくいきませんでした。これはトリックをやった:
element.sendKeys(org.openqa.Selenium.Keys.CONTROL);
element.click();
element << org.openqa.Selenium.Keys.CONTROL
element.click()
または、 Geb を使用している場合、偶数better完全に控えめなソリューション:
(IE7および Geb 0.7. でテスト済み)
abstract class BaseSpec extends geb.spock.GebSpec
{
static
{
def oldClick = geb.navigator.NonEmptyNavigator.metaClass.getMetaMethod("click")
def metaclass = new geb.navigator.AttributeAccessingMetaClass(new ExpandoMetaClass(geb.navigator.NonEmptyNavigator))
// Wrap the original click method
metaclass.click = {->
delegate << org.openqa.Selenium.Keys.CONTROL
oldClick.invoke(delegate)
}
metaclass.initialize()
geb.navigator.NonEmptyNavigator.metaClass = metaclass
}
}
class ClickSpec extends BaseSpec
{
def "verify click"()
{
given:
to HomePage
expect:
waitFor { at HomePage }
when:
dialog.dismiss()
// Call the wrapped .click() method normally
$('#someLink').click()
then:
waitFor { at SomePage }
}
}
class HomePage extends geb.Page
{
static url = "index.html"
static at = { title == "Home - Example.com" }
static content = {
dialog { module DialogModule }
}
}
class SomePage extends geb.Page { ... }
class DialogModule extends geb.Module { def dismiss() { ... } }
私の場合、IE7のクリックは、アニメーションモーダルオーバーレイを閉じる前に失敗するように見えました( jQuery Tools Overlay Modal Dialog を使用しています)。上記のGebメソッドはこの問題を解決しました。
インターネットオプション->セキュリティ->保護モードを有効にするをすべてのゾーンに同じ設定に設定してみてください。 http://www.mail-archive.com/[email protected]/msg13482.html 。これはWatir googlegroupによるものですが、私のSelenium 2テストではIEボタンクリックはこれを適用した後により良く機能するようです。
私はIE version:9と同じ問題に直面していました。
element.sendKeys(Keys.ENTER);
element.click();
別のもの:
WebDriver:* Firefox 18のサポート。 * IEDriverは、「requireWindowFocus」の必要な機能をサポートしています。このイベントとネイティブイベントを使用する場合、IEドライバーはフォーカスを要求し、ユーザーインタラクションはSendInput()を使用してユーザーインタラクションをシミュレートします。これは、テストの実行中にIEを実行しているマシンを他のものに使用してはならないことを意味することに注意してください。
PHPUnit + facebook/php-webdriverでは、関数click()がチェックボックス要素をチェックしないことがあります。
私の解決策は:
$Element = $WebDriver->findElement(
WebDriverBy::id('checkbox_id')
);
if(false === $Element->isSelected())
{
$Element->sendKeys(WebDriverKeys::SPACE);
}
絶対に他のことは私には役に立たなかった。 InternetExplorerDriverの一部のclick()は機能していましたが、機能していませんでした。そして、私は ドキュメント :の1行を見逃していたことを発見しました。ブラウザのズームレベルを100%に設定する必要があります。
他のすべての回答は、ズームレベルが既に100%になっている場合について言及していると思いますが、私の場合は修正されました。最初に確認してください。
短い答え:
IE11で自動化されたSeleniumテストを実行し、ブラウザウィンドウをタッチスクリーンモニター(Windows 8タッチノートパソコンなど)で開いている場合)、非タッチスクリーンでブラウザウィンドウを開いてテストを実行してみてください。
コードのすべての回避策がなくても、元の.click()メソッドは正常に機能します。
回答の背景:
QAチームのテスターと協力して、同様の問題を調査しました。ここと Selenium webdriver IE button issue でほとんどのコードソリューションを試した後、最終的に問題はIE (テスターのWindows 8ラップトップタッチスクリーン上の(バージョン11))。
外部Dellモニターで実行されているIEウィンドウでSeleniumテストを実行すると、標準の.click()呼び出しだけを使用しても、テストは毎回正常に実行できました。
Magnific Popup( http://dimsemenov.com/plugins/magnific-popup/ )ダイアログのボタンのクリックイベントでも失敗していました。
私の仮説:IE11(他のバージョンについては不明)がタッチスクリーン上のマウスクリックイベントへの/からのタッチイベントの変換を処理する方法に問題がある。
もう少し検索した後、繰り返し可能なテストに役立つと思われる2つのことを見つけました。
最初に5秒のImplicitlyWaitを追加しました。これがすべてのFindElement関数に適用されるかどうかはわかりませんが、私が取得していたNoSuchElementExceptionのほとんどの取得を停止しました。
OpenQA.Selenium.IE.InternetExplorerDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver();
driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 0, 5, 0));
//driver.Manage().Speed = Speed.Medium;
次に、ログアウト機能に問題があり、コードを次のように変更しました。
public LoginPageObject Logout() {
Driver.FindElement(By.LinkText("Logout")).Click();
OpenQA.Selenium.Support.UI.IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(Driver, TimeSpan.FromSeconds(5));
IWebElement element = wait.Until(driver => driver.FindElement(By.Name("username")));
LoginPageObject lpage = new LoginPageObject(Driver);
return lpage;
}
明示的な待機は、ImplicitlyWaitがキャッチしないものを処理するようです(リダイレクトのためだと思います)。
要素にフォーカスを強制するより良い方法は、JavaScriptを使用することです。これは、要素がid属性でタグ付けされている場合に機能します。そうでない場合は、開発者に変更してもらいます。
必要なロケーター/プロパティを使用して要素を見つけます。要素を取得したら、ID属性が含まれているかどうかを確認します。存在する場合、次のコードを実行して、要素にフォーカスを強制します。
JavascriptExecutor executor = (JavascriptExecutor) webDriver();
executor.executeScript("document.getElementById('" + element.GetAttribute("id") + "').focus()");
これを使用して、InternetExplorerDriverを使用すると、クリックの失敗に関するほとんどすべての問題が解決されました。
回避策として、各クリックの前に空の文字列を使用してSendKeysを使用しました。
element.SendKeys("");
element.Click();
次の方法で.click()の問題を解決しました。 .click()の代わりにJSとexecuteScript(JS、WebElement el)を使用しました。
例:
protected void clickForIE(WebElement element){
((JavascriptExecutor)wd).executeScript("var tmp = arguments[0];
tmp.click()", element);
}
ただし、このメソッドを使用した後は、ページの読み込み中に待機する必要があります。そして、それが私が次の方法を使用した理由です:
protected synchronized void pageWaitLoad() {
String str = null;
try {
str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState");
}
catch (Exception e) {
// it's need when JS isn't worked
pageWaitLoad();
return;
}
System.out.println("ttt " + str);
while(!str.equals("complete")){
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState");
}
}
ClickForIE()の後に毎回pageWaitLoad()を呼び出す必要があります。
[〜#〜] ie [〜#〜] では、click()アクションを実行しようとすると、ステータスバーでURLが点滅し続けます。これは、ドライバーが要素に注目し、click()アクションを実行しようとしていることを意味します。 click()アクションを完了するために、クリックアクションの前後にsleep()メソッドを使用しました。
この例を試してください。
var webdriver = require('..'), By = webdriver.By, until = webdriver.until;
var driver = new webdriver.Builder().usingServer().withCapabilities({'browserName': 'ie' }).build();
driver.get('http://www.google.com')
.then(function(){
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(1000 * 3);
driver.findElement(By.name('q')).sendKeys('webdriver');
driver.findElement(By.name('btnG')).then(function(button){
button.click();
});
})
.then(function(){
driver.findElement(By.css('div[class="gb_Zb"] a[title="Google Apps"]')).then(function(apps){
apps.click();
driver.findElements(By.css('a[class="gb_O"]')).then(function(appsList){
console.log("apps : "+appsList.length);
for(var i = 0; i < appsList.length; i++){
console.log('applications : '+i);
if(i == 5) {
var element = appsList[i];
driver.sleep(1000 * 5);
driver.executeScript("var tmp = arguments[0]; tmp.click()", element);
driver.sleep(1000 * 5);
} } })
})
})
.then(null, function(err) {
console.error("An error was thrown! By Promise... " + err);
});
driver.quit();
クリックを実行するには、これらのいずれかを使用できます [〜#〜] ie [〜#〜]
element.click();
driver.actions().click(element).perform();
driver.executeScript("var tmp = arguments[0]; tmp.click()", element);
私の解決策は:
Selenium WebDriver 2.29.0(Java)、FF16およびIE9でテスト済み
FindElementを作成する前に、ブラウザの最大画面を作成しました。正常に動作します。
public void maximeBrowser() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenResolution = new Dimension((int)toolkit.getScreenSize().getWidth(), (int)toolkit.getScreenSize().getHeight());
//Maximize the browser
logger.info("Maximizing the browser : getWidth ["+screenResolution.getWidth()+"] - getHeight ["+screenResolution.getHeight()+"]");
getDriver().manage().window().maximize();
}
私はこれを2.0rc2、IE8、Javaでも経験しています。複数のクリックを送信できるソリューションの実装に関する問題は、時々does動作:このような場合、オブジェクトを2回クリックしても、テストの残りの部分は進みません。「Enter」キーストロークを送信しても、コントロールでは動作しません。
同様の問題があります logged ですが、私のオブジェクトは必ずしも「視点」の近くにあるとは限りません。これ以上の提案は大歓迎です。