在Selenium的Onblur事件

时间:2017-09-22 21:55:55

标签: javascript selenium selenium-webdriver

我们在UI中有以下字段,其中实现了onblur事件。当我们手动执行这些步骤时,它可以工作,但是当我们使用Webdriver 2.45版本执行相同的步骤时,它无法在总字段中获得更新值。

HTML code:

<input name="percent_list" id="percent_list" type="text" value="1" align="right" class="formInput" onblur="calculate();">

<input name="percent_sell" id="percent_sell" type="text" value="1" align="right" class="formInput" onblur="calculate();">

<input name="total_commision" id="total_commision" type="text" value="2.00" readonly="yes" class="formInput">

测试数据: - 第1场:1.00 - 第2场:1.00 - 验证字段(总计):2.00

步骤: - 为字段1和输入值输入值2。 - 验证总计字段是否具有字段1和2的总和。

观察:我们看到,由于事​​件是onblur,它可以手动工作,但是使用IE浏览器和Selenium,UI不会自动填充总和值。

尝试方法: - Sendkeys:没用。尝试点击其他webelement也没有奏效。 - 使用过的Java脚本编辑器也没有用。我们能够更新字段1和2,但字段总和不会自动求和。 - 尝试过使用Keys.TAB。它没用。

代码:

driver.findElement(By.id("percent_list")).sendKeys("2.5");
           //JavascriptExecutor jse = (JavascriptExecutor) driver;
          // jse.executeScript("arguments[0].setAttribute('value', arguments[1])", driver.findElement(By.id("percent_sell")), Keys.TAB);
           //jse.executeScript("arguments[0].setAttribute('value', arguments[1])", driver.findElement(By.id("referral_fee_percent")), Keys.TAB);
           driver.findElement(By.id("listing_agent_bonus")).click();

有任何建议可以解决这种与onblur相关的行为吗?

2 个答案:

答案 0 :(得分:0)

使用Selenium JavascriptExecutor有两种方法可以做到这一点,一旦你在字段中输入了值,就可以使用以下两种方法:

 JavascriptExecutor jse = (JavascriptExecutor) driver;
 jse.executeScript('calculate();');

或者如果您希望在Selenium中收到输出:

Object value = jse.executeScript('return calculate();');

<强>更新

您还可以尝试以下代码:

JavascriptExecutor jse = (JavascriptExecutor) driver;

WebElement input1 = driver.findElement(By.id("percent_list"));
WebElement input2 = driver.findElement(By.id("percent_sell"));

input1.sendKeys(your_value);
jse.executeScript('arguments[0].onblur()', input1);

input2.sendKeys(your_value);
jse.executeScript('arguments[0].onblur()', input2);

答案 1 :(得分:0)

<强>分析

blur方法对不是文档中活动元素的元素没有影响。

由于InternetExplorerDriver仅限Windows,因此它会尝试使用所谓的“本机”或操作系统级事件在浏览器中执行鼠标和键盘操作。这与将模拟JavaScript事件用于相同操作形成对比。

我想点击()并按你的InternetExplorerDriver 按Tab键不会更改活动元素,所以即使点击其他元素也不会触发模糊。

<强>解决方案

我使用selenium-webdriver Nodejs包准备一个javascript代码段,它打开github login page并通过sendKeys()输入用户名和Tab键

我在我的Chrome / Firefox / IE 11上运行脚本,在sendKeys()调用之后,我注意到密码文本框从页面获取焦点并且脚本打印出来的活动元素也是3个浏览器上的密码文本框。

您可以在IE浏览器上运行以下代码并观看密码文本框是否可以获得焦点? print out active元素也是密码文本框?

如果上面两个答案是肯定的,请修改代码以通过更改网址到您的网站并将用户名文本框更改为“字段1”来测试您的网页,然后运行以查看将要发生的情况。

如果两个答案中的任何一个不是,请更改您的InternetExplorerDriver版本,然后重新运行

感谢您抽出时间来运行我的脚本以证明我的猜测,希望我们可以从这个问题中了解更多信息,不仅仅是通过谷歌搜索使用解决方案,还不知道为什么。

var webdriver = require('selenium-webdriver'),
    By = webdriver.By,
    Key = webdriver.Key,
    Capabilities = webdriver.Capabilities;

function getDriver(browserName) {
    if (browserName === 'internet explorer') {
        let capabilities = Capabilities.ie();
        capabilities.set('ignoreProtectedModeSettings', true);
        capabilities.set('ignoreZoomSetting', true);

        return new webdriver.Builder()
            .forBrowser(browserName)
            .withCapabilities(capabilities)
            .usingServer('http://localhost:4444/wd/hub')
            .build();
    } else {
        return new webdriver.Builder()
            .forBrowser(browserName)
            .usingServer('http://localhost:4444/wd/hub')
            .build();
    }
}

function login_github(driver) {
    driver.get('https://github.com/login');

    driver.sleep(5000);

    driver.findElement(By.css('#login_field')).sendKeys('abc@gmail.com', Key.TAB);

    driver.sleep(2000);

    // expect password text box obtain focus and become active element
    // below code should print out the html code of password text box
    // <input class="form-control form-control input-block" id="password" 
    // name="password" tabindex="2" type="password">
    driver.executeScript("return new XMLSerializer().serializeToString(document.activeElement);")
        .then(function(html) {
            console.log('activeElement html: ' + html);
        })

    driver.sleep(5000);

    driver.quit();
}

//run on chrome
// login_github(getDriver('chrome'));
//run on firefox
// login_github(getDriver('firefox'));
//run on ie
login_github(getDriver('internet explorer'));

仅供参考,我在我的代码中使用了RemoteWebDriver,因此我使用Nodejs包:webdriver-manager在我的本地设置selenium服务器。我使用以下版本:

standalone-server 3.4.0
InternetExplorerDriver-32bit 3.5.1
chromedriver 2.30
geckodriver v0.19.0
chrome browser 60
firefox browser 55
ie browser 11

以下是我安装webdriver.exe和standalone-sever

的命令
webdriver-manager update --versions.standalone=3.4.0 --versions.chrome=2.30 --verions.ie=3.5.1 --version.gecko=v0.19.0

以下是启动selenium服务器的命令:

webdriver-manager start --versions.standalone=3.4.0 --versions.chrome=2.30 --verions.ie=3.5.1 --version.gecko=v0.19.0