41

IE9でIEドライバーを使用する場合、Clickメソッドがボタンのみを選択することがあり、Click()のアクションを実行しません。これはたまにしか起こらないので、問題になるのはコードではないと思います。Firefox4でFirefoxドライバーを使用しても問題はありません。また、要素がときどき見つからないという問題もありますが、FirefoxではなくIEでのみ見つかります。

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を持っていません。

4

18 に答える 18

28

.Click()Seleniumがリンクをクリックしているのを見ることができますが、Internet Explorer 8でリンクをクリックしようとすると、同じことがわかりました。私の経験から、ブラウザにフォーカスがない場合、最初のクリックは機能しないようです。

これに対する回避策は、ページ上の別の要素にを送信し.Click()て、リンクをクリックしようとする前に、ブラウザがフォーカスを取得するようにすることです。たとえば、その親です。

Driver.FindElement(By.Id("Logout")).FindElement(By.XPath("..")).Click();
Driver.FindElement(By.Id("Logout")).Click();
于 2011-04-07T07:24:29.830 に答える
16

IEドライバーにバグがあり、同じバージョンのIEを使用する異なるマシンでは、同じバージョンのコードの動作が異なります。

各アクションの前に一貫して取得するために、私は次のことを行います。

   driver.SwitchTo().Window(driver.CurrentWindowHandle);//Force Focus

私にとって、これによりIEドライバーは期待どおりに動作します。

于 2011-10-20T12:17:50.560 に答える
8

同じ問題が発生しました。クリックがIEで機能しません。Driver.FindElement(By.Name( "..."))。sendKeys( "\ n")を実行してクリックを実行する回避策を見つけました(基本的にはボタンのEnterキーを押すだけです)。あまりきれいではありませんが、問題が修正されるまで機能します。

于 2011-04-12T11:52:10.270 に答える
7

プロジェクトでSeleniumWebDriver2.15.0を参照し、Selenium WebDriver Server 2.16.0を使用してソリューションをリファクタリングし、次のことを確認しました。

  • クリックイベント、を使用すると正しく発生しますFirefoxDriver
  • を使用すると、特定のコントロールに対してクリックイベントが正しく発生しません。RemoteWebDriverDesiredCapabilities.Firefox
  • とを使用すると、クリックイベント正しく発生しますRemoteWebDriverDesiredCapabilities.HtmlUnitDesiredCapabilities.HtmlUnitWithJavaScript
  • とwith (実際には同じもの)はまだ一貫性のない結果を私に与えており、私はそれを突き止めるのが難しいと感じていますInternetExplorerDriverRemoteWebDriverDesiredCapabilities.InternetExplorer

最初の3つのポイントに対する私の解決策は、拡張する独自のクラスを作成することでした。RemoteWebDriverこれにより、カスタム動作を参照しRemoteWebElement続けるテストコードから隠すことができます。IRemoteWebDriverIWebElement

現在の「微調整」は以下のとおりですが、これらのカスタムクラスを使用すると、テストコードを変更することなく、ドライバーと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();
    }
}
于 2011-04-18T08:09:31.643 に答える
7

上記の解決策はどれも私にはうまくいきませんでした。これはトリックをしました:

Java

element.sendKeys(org.openqa.selenium.Keys.CONTROL);
element.click();

Groovy

element << org.openqa.selenium.Keys.CONTROL
element.click()

ゲブ

または、Gebを使用している場合は、完全に邪魔にならないさらに優れたソリューションがあります。

(IE7およびGeb 0.7.0でテスト済み)

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メソッドはこの問題を解決しました。

于 2012-04-26T22:57:02.520 に答える
2

[インターネットオプション]->[セキュリティ]->[保護モードを有効にする]をすべてのゾーンで同じ設定に設定してみてください。http://www.mail-archive.com/watir-general@googlegroups.com/msg13482.htmlを参照してください。これはWatirgooglegroupによるものですが、私のSelenium 2テストでは、これを適用した後、IEボタンのクリックがうまく機能するようです。

于 2011-07-20T08:14:02.600 に答える
1

IEバージョンを使用しています:9同じ問題に直面していました。私の場合、以下が機能しました

element.sendKeys(Keys.ENTER);
element.click();
于 2012-05-23T11:36:25.307 に答える
1

絶対に他のことは私のために働いていませんでした。一部のInternetExplorerDriverclick()は私のために機能していましたが、機能しなかったものもありました。次に、ドキュメントの1行を見逃していることに気付きました。ブラウザのズームレベルを100%に設定する必要があります。

他のすべての回答は、ズームレベルがすでに100%になっている場合を指していると確信していますが、私の場合は修正されました。したがって、最初にそれを確認してください。

于 2012-07-20T11:39:40.633 に答える
1

もう1つ:

v2.29.0

WebDriver:*Firefox18のサポート。* IEDriverは、「requireWindowFocus」の必要な機能をサポートします。このイベントとネイティブイベントを使用する場合、IEドライバーはフォーカスを要求し、ユーザーインタラクションはSendInput()を使用してユーザーインタラクションをシミュレートします。これは、テストの実行中にIEを実行しているマシンを他の目的で使用してはならないことを意味することに注意してください。

于 2013-03-05T21:42:57.967 に答える
1

PHPUnit + facebook / php-webdriver関数click()がチェックボックス要素をチェックしない場合があります。

私の解決策は次のとおりです。

$Element = $WebDriver->findElement(
    WebDriverBy::id('checkbox_id')
);

if(false === $Element->isSelected())
{
    $Element->sendKeys(WebDriverKeys::SPACE);
}
于 2014-01-20T13:57:43.227 に答える
1

簡単な回答:タッチスクリーンモニター(Windows 8タッチラップトップなど)で
ブラウザーウィンドウを開いた状態でIE11で自動Seleniumテストを実行している場合は、非タッチスクリーンでブラウザーウィンドウを開いた状態でテストを実行してみてください。 元の.click()メソッドは、すべてのコード回避策がなくても正常に機能するはずです。

回答の背景:
QAチームのテスターと協力して、同様の問題を調査しました。ここでほとんどのコードソリューションを試した後、セレンWebドライバーのIEボタンの問題で、最終的に問題がテスターのWindows 8ラップトップタッチスクリーンのIE(バージョン11)でのみ発生したことがわかりました。
外部のDellモニターでIEウィンドウを実行してSeleniumテストを実行すると、標準の.click()呼び出しだけを使用しても、テストを毎回正常に実行できました。Magnific Popup( http://dimsemenov.com/plugins/magnific-popup/)ダイアログ
のボタンのクリックイベントにも失敗していました。

私の仮説:IE11(他のバージョンについては不明)がタッチスクリーン上のマウスクリックイベントとの間のタッチイベントの変換を処理する方法に問題があります。

于 2015-07-14T04:27:48.797 に答える
0

もう少し検索した後、繰り返し可能なテストに役立ったと思われる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がキャッチしないものを処理しているようです(リダイレクトのためだと思います)。

http://code.google.com/p/selenium/source/browse/trunk/support/src/csharp/webdriver-support/UI/WebDriverWait.cs?r=10855

于 2011-04-07T02:15:17.433 に答える
0

私は2.0rc2、IE8、Javaでもこれを経験しています。複数のクリックを送信できるソリューションを実装する際に私が抱える問題は、それ機能する場合があることです。そのような場合、オブジェクトを2回クリックしても、残りのテストは先に進みません。「Enter」キーストロークを送信しても、コントロールでは機能しません。

これについても同様の問題が記録されていますが、私のオブジェクトは必ずしも「視点」の近くにあるとは限りません。これ以上の提案をいただければ幸いです。

于 2011-06-17T19:47:11.830 に答える
0

要素にフォーカスを強制するためのより良い方法は、Javascriptを使用することです。これは、要素がid属性でタグ付けされている場合に機能します。そうでない場合は、開発者に変更してもらいます。

必要なロケーター/プロパティを使用して要素を検索します。要素が取得されたら、ID属性が含まれているかどうかを確認します。含まれている場合は、次のコードを実行して、要素にフォーカスを強制します。

JavascriptExecutor executor = (JavascriptExecutor) webDriver();
executor.executeScript("document.getElementById('" + element.GetAttribute("id") + "').focus()");

これを使用すると、InternetExplorerDriverを使用したときに、クリックミスに関するほとんどすべての問題が解決されました。

于 2012-05-23T04:54:51.407 に答える
0

次の方法で.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()を呼び出す必要があります。

于 2012-09-24T14:45:27.253 に答える
0

私の解決策は次のとおりです。

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();
    }
于 2013-03-05T21:12:09.027 に答える
0

回避策として、各クリックの前に空の文字列を含むSendKeysを使用しました。

element.SendKeys("");
element.Click();
于 2013-06-07T10:39:02.887 に答える
0

WebdriverJS

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);
于 2015-10-14T13:00:14.010 に答える