Selenium JavaScript:匿名vs命名函数

时间:2017-03-27 18:25:25

标签: javascript selenium

对于Selenium JavaScript,似乎我在interwebs上阅读的每个示例都解释了处理JavaScript异步性质的最佳方法是使用.then()创建一个匿名函数来查找/交互每个元素页面,而不是创建命名函数并在运行时调用它们。

例如,如果我想要使用凭据登录网站:

上下文:

'use strict';
const WebDriver = require('selenium-webdriver');
const By    = WebDriver.By;
const until = WebDriver.until;
var driver = new WebDriver.Builder().withCapabilities(
    WebDriver.Capabilities.chrome()).build();

示例A:

driver.get("http://somefakewebsite.com")
.then(function(){ driver.findElement(By.id("login")).sendKeys("myLogin"); })
.then(function(){ driver.findElement(By.id("password").sendKeys("myPassword"); })
.then(function(){ driver.findElement(By.id("submit").click(); })
.then(function(){ driver.wait(until.elementLocated(By.id("pageId")), 5000); })
.then(function(){ driver.findElement(By.id("buttonOnlyAvailableAfterLogin").click(); })

例B:

function inputLogin(driver){
    driver.findElement(By.id("login")).sendKeys("myLogin");
}

function inputPassword(driver){
    driver.findElement(By.id("password")).sendKeys("myPassword");
}

function clickSubmit(driver){
    driver.findElement(By.id("submit")).click();
}

function waitAfterLogin(driver){
    driver.wait(until.elementLocated(By.id("pageId")), 5000);
}

function clickSomeButtonAfterLogin(driver){
    driver.findElement(By.id("buttonOnlyAvailableAfterLogin")).click();
}

driver.get("http://somefakewebsite.com")
.then(inputLogin(driver))
.then(inputPassword(driver))
.then(clickSubmit(driver))
.then(waitAfterLogin(driver))
.then(clickSomeButtonAfterLogin(driver))

我的问题:使用示例A优于示例B是否有优势?看起来它们在尝试运行时都有效。虽然第二种方式似乎更多的代码行,但它感觉更有条理,更容易阅读(因为命名函数正在告诉我到底发生了什么,而不是试图读取示例A中匿名函数中的逻辑)。

1 个答案:

答案 0 :(得分:0)

2之间的区别如下:

示例A 等待承诺履行,然后将每个方法彼此链接。

示例B 与以下内容大致相同:

const result = driver.get("http://somefakewebsite.com")

inputLogin(driver)
inputPassword(driver)
clickSubmit(driver)
waitAfterLogin(driver)
clickSomeButtonAfterLogin(driver)

result
  .then(undefined)
  .then(undefined)
  .then(undefined)
  .then(undefined)
  .then(undefined)

如果示例B 适合您,那么可能driver.get可能不需要履行,以使其上的方法有效,或者问题是缺少您的关键部分码。或承诺立即履行。或者阻止。