对于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中匿名函数中的逻辑)。
答案 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
可能不需要履行,以使其上的方法有效,或者问题是缺少您的关键部分码。或承诺立即履行。或者阻止。