Selenium webdriver driver.findElement()方法返回Object - 为什么?我做错了什么?

时间:2016-02-23 10:06:16

标签: javascript selenium-webdriver

代码示例:

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
    //...
});

driverwebdriver课程,他的findElement(locator)方法应返回webdriver.WebElementerrorElement)。它应该是

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()方法接收它?

enter image description here

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

1 个答案:

答案 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。