代码示例:
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('http://...');
driver.getTitle().then(function(title){
if("..."===title){
driver.findElement(webdriver.By.xpath('html/body/div/header/div/div/div[2]/div[2]/a[1]'))
.click();
};
});
driver.wait(function(){
return driver.isElementPresent(webdriver.By.name('fos_user_registration_form[email]'));
}, 3000, 'Failed to load Registration form');
driver.findElement(webdriver.By.name('fos_user_registration_form[email]'))
.sendKeys('valentine-test@yandex.ru');
driver.findElement(webdriver.By.name('fos_user_registration_form[plainPassword]'))
.sendKeys('123Aa');
driver.findElement(webdriver.By.id('btn-submit')).click();//сабмит
driver.wait(function(){
return driver.isElementPresent(webdriver.By.className("form-error-fos-user-registration-form-plainPassword"));
}, 3000, 'Element' + "form-error-fos-user-registration-form-plainPassword" + ' do not found');
var flow = webdriver.promise.controlFlow();
function getInputText(){
errerElement = driver.findElement(webdriver.By.className("form-error-fos-user-registration-form-plainPassword"));
};
flow.execute(getInputText).then(function(){
console.log(errorElement); //debug printing
//...
});
有driver
个webdriver
课程,他的findElement(locator)
方法应返回webdriver.WebElement
(errorElement
)。它应该是
webdriver.Serializable<{ELEMENT: string}>
└ webdriver.WebElement
在控制台中,我errorElement
类型为Object
:
Object {
driver_:
Object {
session_:
Object {
closure_uid_174854009: 13,
flow_: [Object],
stack_: [Object],
parent_: null,
callbacks_: null,
state_: 'fulfilled',
handled_: true,
value_: [Object],
queue_: null },
executor_: { execute: [Function] },
flow_:
Object {
events_: Object {},
propagateUnhandledRejections_: true,
activeQueue_: [Object],
taskQueues_: Set {},
shutdownTask_: null,
hold_: [Object],
closure_uid_174854009: undefined },
fileDetector_: null },
id_:
Object {
closure_uid_174854009: 709,
flow_:
Object {
events_: Object {},
propagateUnhandledRejections_: true,
activeQueue_: [Object],
taskQueues_: Set {},
shutdownTask_: null,
hold_: [Object],
closure_uid_174854009: undefined },
stack_: null,
parent_: null,
callbacks_: null,
state_: 'fulfilled',
handled_: false,
value_: Object { ELEMENT: 'unused' },
queue_:
Object {
events_: [Object],
closure_uid_174854009: 702,
name_: 'TaskQueue::702',
flow_: [Object],
tasks_: [],
interrupts_: null,
pending_: null,
state_: 'finished',
unhandledRejections_: Set {} } },
cancel: [Function: bound ],
isPending: [Function: bound ],
then: [Function: bound ],
thenCatch: [Function: bound ],
thenFinally: [Function: bound ],
getId: [Function] }
这是正常的还是没有?????
因此,我必须使用WebElement
的方法,而不是文档中描述的方法。
例如,根据文档getText()
方法应该返回webdriver.promise.Promise<string>
(实际上是字符串),但对我来说将返回一个新的Object
(通过errorText = driver.findElement(webdriver.By.className("form-error-fos-user-registration-form-plainPassword")).getText();
然后console.log(errorText)
):
Object {
closure_uid_852736611: 570,
flow_:
Object {
events_: Object {},
propagateUnhandledRejections_: true,
activeQueue_:
Object {
events_: [Object],
closure_uid_852736611: 624,
name_: 'TaskQueue::624',
flow_: [Circular],
tasks_: [],
interrupts_: null,
pending_: null,
state_: 'new',
unhandledRejections_: Set {} },
taskQueues_: Set {},
shutdownTask_: null,
hold_:
{ _called: false,
_idleTimeout: 2147483647,
_idlePrev: [Object],
_idleNext: [Object],
_idleStart: 1136,
_onTimeout: [Function: wrapper],
_repeat: [Function] },
closure_uid_852736611: undefined },
stack_: null,
parent_: null,
callbacks_: null,
state_: 'fulfilled',
handled_: false,
value_: 'Пароль должен состоять из символов латинского алфавита и содержать минимум одну цифру, одну заглавную и одну строчную буквы',
queue_: null }
为了得到文本,我应该做console.log(errorText.value _)。
等等。对于现场的所有元素。这很不舒服。
还有元素的属性。错误文本在innerText
属性中,为什么我无法通过.getText()
方法接收它?
UPD。没有controlFlow的代码的最后一部分:
function getInputText(){
return inputText = driver.findElement(webdriver.By.className("form-error-fos-user-registration-form-plainPassword")).getText();
};
getInputText().then(function(){
console.log(inputText);
});
答案 0 :(得分:1)
我不是承诺/控制流的专家,但我认为你滥用这个功能 - 使用超出其适当范围的东西,因此没有妥善包装/解包 - 这会引起混淆。
对于初学者来说,你有两个单独的var flow = webdriver.promise.controlFlow();
行,即使你(大概)试图实现的是链接元素发现和调试打印,最多只能是一个范围。
即使这样,也不清楚为什么你需要controlFlow()
,因为你不需要安排任务,除了你的getText()
电话可以被链接到你的findElement()
电话。请参阅示例here,并按文档说明:
WebDriver API位于promise Manager
之上
你不能简单地做......?
console.log(driver.findElement(webdriver.By.className(“form-error-fos-user-registration-form-plainPassword”))。getText());
<强>更新强>
正确使用异步代码来记录getText()
:
driver.findElement( webdriver.By.className("form-error-fos-user-registration-form-plainPassword") )
.getText()
.then(function(txt) {
console.log("Text is: " + txt);
});
产地:
Text is: Пароль должен состоять из символов латинского алфавита и содержать минимум одну цифру, одну заглавную и одну строчную буквы
如果您已完成getText()
,基本上WebElement
工作正常。如果你没有正确获得异步依赖,你的代码几乎会立即运行,并且会返回一个Promise。