2014-01-02 2 views
6

Я пытаюсь использовать примерочные поймать блок в моем транспортире тесте, см код ниже:Нужна помощь по примерке улову

try { 
    element(by.id('usernameas')).sendKeys(data); 
} 
catch(err) { 
    console.log('error occured'); 
} 

Я сознательно передавая неправильный локатор, чтобы проверить это происходит в улове блок или нет, в настоящее время он дает мне ошибку NoSuchElementError в командной строке, а выполнение теста останавливается, а не переходит в блок catch.

Просьба предложить.

ответ

14

Вызов элемента (локатора) .sendKeys возвращает обещание, которое либо разрешено, либо отклонено. Обещание является частью теста control flow.

Сам вызов элемента (локатора) не вызывает ошибку, это обещание, которое отклонено. Если вам не удалось найти элемент, на самом деле вы хотите, чтобы весь ваш тест завершился неудачей, так как scneario не может быть завершен.

Для получения сообщения об ошибке вы можете использовать ответные вызовы с обещаниями, как показано ниже.

Важное примечание: если вы регулируете неудачу обещание сами ваш тест не подведет, так что вы должны лучше повторно выдать его

try { 
    element(by.id('usernameas')).sendKeys(data).then(function() { 
     console.log('keys sent successfully'); 
    }, function(err) { 
     console.error('error sending keys ' + err); 
     throw err; 
    }); 
} 
catch(err) { 
    console.log('error occured'); 
} 

Выход консоли (обрезается):

error sending keys NoSuchElementError: no such element 
    (Session info: chrome=31.0.1650.63) 
    (Driver info: chromedriver=2.8.241075,platform=Windows NT 6.1 S ..... 
+0

Я не знал, что это возможно! Тебе не нужно «пытаться поймать» в этот момент, если нет аль isterener или более крупный обработчик для родителя, который теперь делает это грязным в консоли. На данный момент это почти бесполезно. Но серьезно, обратный вызов ошибки просто спас мне жизнь. Благодаря! –

1

Недавно я столкнулся с этой проблемой и заметил, что вам не нужен блок try/catch. В транспортир, вы можете достичь TRY/поймать как следующее:

try { <---------------------------- Traditional TRY/CATCH method 
    loadWebApp(); 
    login(); 
    openUserPreferences(); 
    changePassword(); 
} catch (err) { 
    console.error(
     "An error was thrown! " + err); 
} 

loadWebApp(). 
    then(login). 
    then(openUserPreferences). 
    then(changePassword). 
    then(null, function(err) { <----------------- PROTRACTOR equivalent of try/catch 
     console.error(
      "An error was thrown! " + err); 
    }); 

Вот источник, где я получил эту информацию от: https://code.google.com/p/selenium/wiki/WebDriverJs#Promises
под Value Propagation and Chaining

Так опять же, вам не нужно явно добавлять попробовать/поймать.

Короче говоря, причина этот метод работает, потому что a promise can either be RESOLVED or REJECTED and in case of a rejected or failed promise, this line [ then(null, function(err) { ... } ] will act as the CATCH block.

заметить также, что тогда (нуль, функция (ERR)) (не принимает никакого обратного вызова, но лишь errBack, поэтому в основном, это говорит, что мы не заботиться о том, разрешено ли обещание, мы заботимся только о том, не сработает ли он и, следовательно, NULL для обратного вызова и функция (ошибка) для errBack.
Не нужно обертывать это в try/catch, а затем бросать ошибку, как было предложено выше, принятый ответ (@Eitan Peer).

Надеюсь, что это помогает кому-то, кто борется с Транспортером, как и я.