41

使用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。

4

18 回答 18

28

尝试单击链接时,我在 Internet Explorer 8 上发现了同样的情况.Click()- 即使我可以看到 Selenium 单击链接。根据我的经验,如果浏览器没有焦点,那么初始点击将不起作用。

解决方法是.Click()在尝试单击链接之前将 a 发送到页面上的另一个元素,以便浏览器获得焦点,例如它的父级:

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

以上解决方案都不适合我。这成功了:

爪哇

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

时髦的

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() { ... } }

在我的情况下,只要在关闭动画模式覆盖(我们正在使用jQuery Tools Overlay Modal Dialog )之前单击 IE7 似乎就会失败。上面的 Geb 方法解决了这个问题。

于 2012-04-26T22:57:02.520 回答
7

我基于在我的项目中引用 Selenium WebDriver 2.15.0 并使用 Selenium WebDriver Server 2.16.0 重构了我的解决方案,并且我做了以下观察:

  • click 事件在使用时正确触发FirefoxDriver
  • 使用for时,某些控件的 click 事件不会正确触发RemoteWebDriverDesiredCapabilities.Firefox
  • 使用for和时,click 事件正确触发RemoteWebDriverDesiredCapabilities.HtmlUnitDesiredCapabilities.HtmlUnitWithJavaScript
  • theInternetExplorerDriverRemoteWebDriverwith DesiredCapabilities.InternetExplorer(实际上是同一件事)仍然给我不一致的结果,我发现很难确定。

我对前三点的解决方案是创建自己的扩展类,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 回答
2

尝试将Internet 选项 -> 安全 -> 启用保护模式设置为所有区域的相同设置,请参阅http://www.mail-archive.com/watir-general@googlegroups.com/msg13482.html。这是来自 Watir googlegroup,但在我的 Selenium 2 测试中,IE 按钮点击似乎在应用此功能后效果更好。

于 2011-07-20T08:14:02.600 回答
1

另一个:

v2.29.0

WebDriver:* Firefox 18 支持。* IEDriver 支持“requireWindowFocus”所需的功能。当使用这个事件和本机事件时,IE 驱动程序将要求焦点,用户交互将使用 SendInput() 来模拟用户交互。请注意,这意味着您不得在测试运行时将运行 IE 的机器用于其他任何事情。

于 2013-03-05T21:42:57.967 回答
1

绝对没有其他事情对我有用。有些 InternetExplorerDriver click() 对我有用,有些则没有。然后我发现我错过了文档中的一行:浏览器的缩放级别必须设置为 100%。

我确信所有其他答案都指缩放级别已经为 100% 的情况,但它确实解决了我的情况。所以请先检查一下。

于 2012-07-20T11:39:40.633 回答
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

我使用的是 IE 版本:9 面临同样的问题。以下适用于我的情况

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

简短回答:
如果您在 IE11 中运行自动 Selenium 测试,并在触摸屏显示器(例如 Windows 8 触摸笔记本电脑)上打开浏览器窗口,请尝试在非触摸屏中打开浏览器窗口运行测试。
原始的 .click() 方法应该可以在没有所有代码变通方法的情况下正常工作。

答案背景:
我与我们 QA 团队的一名测试人员一起调查了一个类似的问题。在尝试了这里和selenium webdriver IE button issue的大部分代码解决方案后,我们最终发现问题只发生在测试人员 Windows 8 笔记本电脑触摸屏上的 IE(我们的版本 11)中。
使用在外部戴尔显示器上运行的 IE 窗口运行 Selenium 测试可以让测试每次都运行良好,即使只使用标准的 .click() 调用也是如此。我们在 Magnific Popup ( http://dimsemenov.com/plugins/magnific-popup/ ) 对话框
中的按钮的单击事件上也失败了。

我的假设:IE11(不确定其他版本)如何处理触摸事件与触摸屏上的鼠标单击事件之间的转换存在问题。

于 2015-07-14T04:27:48.797 回答
0

我在 2.0rc2、IE8、Java 中也遇到过这种情况。我在实现可以发送多次点击的解决方案时遇到的问题是,有时它确实有效。在这些情况下,单击我的对象两次不会让我的其余测试继续进行。发送“Enter”击键也不适用于我们的控件。

为此记录了一个类似的问题,但我的对象不一定靠近“视点”。任何更多的建议将不胜感激。

于 2011-06-17T19:47:11.830 回答
0

作为解决方法,我在每次单击之前使用了带有空字符串的 SendKeys:

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

经过一番搜索后,我发现了两件事似乎有助于可重复测试:

首先,我添加了 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

将焦点集中在元素上的更好方法是使用 Javascript。当您的元素使用 id 属性标记时,此方法有效。如果不是,请让开发人员更改它。

使用您需要的任何定位器/属性查找元素。检索到元素后,检查它是否包含 ID 属性。如果是,则执行以下代码,将焦点强制到元素:

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

使用这个,几乎所有的点击丢失的问题都在使用 InternetExplorerDriver 时得到了解决。

于 2012-05-23T04:54:51.407 回答
0

我解决了 .click() 下一步的问题。我使用 JS 和 executeScript(JS, WebElement el) 而不是 .click()。
例子:

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

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 回答