Selenium 2.0b3的IE WebDriver,点击无反应

41

使用IE9驱动程序时,偶尔单击方法仅选择按钮,而不执行单击()的操作。请注意,这种情况只会偶尔发生,因此我认为问题不在代码上。使用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();
}

我看到了类似的问题(https://dev59.com/OVPTa4cB1Zd3GeqPkIg5

18个回答

1
绝对没有其他方法适用于我。 一些InternetExplorerDriver的click()适用,而有些不适用。 然后我发现在文档中漏掉了一行:浏览器的缩放级别必须设置为100%。
我确信所有其他答案都是针对缩放级别已经为100%的情况,但这确实解决了我的问题。因此,请先检查这一点。

0

经过更多的搜索,我发现两件事似乎在可重复的测试中有所帮助:

首先,我添加了一个5秒的隐式等待时间。不确定这是否适用于所有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;
}

显式等待似乎可以处理隐式等待无法捕获的内容(我认为是因为重定向)。

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


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);

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()。

0
我使用了一个解决方法,在每次点击之前使用空字符串的SendKeys:
element.SendKeys("");
element.Click();

0

我在使用2.0rc2、IE8和Java时也遇到了这个问题。我在实现能够发送多次点击的解决方案时遇到的问题是,有时它确实可以工作。在这些情况下,点击我的对象两次不会让我的测试继续进行。在我们的控件上发送“Enter”按键也不起作用。

这个问题有一个类似的记录,但我的对象不一定靠近“视点”。如果有更多建议,将不胜感激。


0
更好的强制焦点在元素上的方法是使用Javascript。这适用于您的元素带有id属性的情况。如果没有,请让开发人员更改它。
使用任何定位器/属性查找元素。一旦检索到元素,请检查是否包含ID属性。如果是,则执行以下代码,将焦点强制转移到该元素:
JavascriptExecutor executor = (JavascriptExecutor) webDriver();
executor.executeScript("document.getElementById('" + element.GetAttribute("id") + "').focus()");

使用这个方法,当使用InternetExplorerDriver时,几乎所有丢失点击的问题都解决了。


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();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接