2013-09-04 6 views
2

Я пишу некоторые тесты для моего сайта с помощью WebdriverIO рядом Мокко/Chai, но когда я делаю это:Должен ли я всегда ждать, прежде чем нажимать?

it('select application', function(done) { 
    client 
     .click('.disciplinetext > table:nth-child(7) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(3) > button:nth-child(1)') 
     // more stuff 

Элемент еще не существует (не был вынесен). Должно ли .click() неявно ждать завершения загрузки страницы, прежде чем она попытается щелкнуть элемент?

Он отлично работает, если я хлопнуть эту строку перед ней:

.waitFor('.disciplinetext > table:nth-child(7) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(3) > button:nth-child(1)',1000) 

Но я не хочу, чтобы бросить waitFor перед каждым .setValue(), .click(), .getText(), или любой другой API command. Я что-то упускаю?

Есть ли команда, ожидающая загрузки всей страницы, или параметр, чтобы неявно ждать до доступа к элементу?

+0

'.click'" будет "неявно ждать загрузки страницы, прежде чем работать с элементом. Этот элемент добавляется к DOM через ajax? – sircapsalot

+0

@sircapsalot: Нет, он находится в источнике страницы Ctrl + U при загрузке страницы. – mpen

+0

Может быть, второй комментарий в этом обсуждении (https://groups.google.com/forum/#!topic/webdriver/8n55XfpDSGo) будет полезен. FYI, существует реализация 'implicitWait' в связываниях Java, Python, Ruby для webdriver selenium. – Amey

ответ

2

Вы можете установить длительность неявного ожидания через:

Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2)); 

Значение по умолчанию равно 0, поэтому нажмите кнопку() срабатывает мгновенно.

Очевидно, что это пример C#, но, надеюсь, вы можете его перевести.

Я думаю, что это webdriverjs пример:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
+2

'webdriverjs.manage', к сожалению, не существует. Невозможно найти ссылку на 'implicitlyWait' в источнике :-( – mpen

+0

Когда я посмотрел здесь: http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits - я нашел информация о implictlywaits по умолчанию равна 0. Не знаю, почему документация не соответствует указанному коду. – Richard

+0

да, я тоже это нашел .. источник selenium 2 - это беспорядок путаницы в любом случае. – sircapsalot

1

Это не выглядит как webdriverjs даже имеет неявный тайм-аут, Ergo, никоим образом не изменить его.

1 решение, которое я могу придумать, чтобы переопределить метод click() к чему-то вроде этого ... (обратите внимание, что это псевдо.)

click = function(what) { 
    waitFor(what); 
    super(what); 
} 

это явное ожидание, но мы можем рассмотреть это неявное ;)

EDIT: я сделал еще заглянуть в «святая святых» из webdriverjs, и я нашел этот отрывок из here

/** 
* ... 
* @param {number} ms The amount of time to wait, in milliseconds. 
* @return {!webdriver.promise.Promise} A promise that will be resolved when the 
*  implicit wait timeout has been set. 
*/ 
webdriver.WebDriver.Timeouts.prototype.implicitlyWait = function(ms) { 
    return this.driver_.schedule(
     new webdriver.Command(webdriver.CommandName.IMPLICITLY_WAIT). 
      setParameter('ms', ms < 0 ? 0 : ms), 
     'WebDriver.manage().timeouts().implicitlyWait(' + ms + ')'); 
}; 

Попробуйте сделать несколько масок javascript, чтобы переопределить этот метод.

+0

Я думаю, что это библиотека, отличная от той, которую я использую ... хотя еще не слишком поздно переключаться, если это работает лучше. – mpen

+0

вы абсолютно правы ... это фактически официальный JavaScript-интерфейс seleniums. первый метод будет работать, если вы сможете это понять :) – sircapsalot

+0

Да, я придумал это, прежде чем вы разместили это: 'client.addCommand ('waitClick', function (selector, ms) { return this.waitFor (selector, ms || 1000, функция (ошибка) { ожидать (ошибка, селектор) .to.be.null; }). Щелчок (селектор); }); '(который также проходит проверку мокко/чэй) ... это неплохо, но в библиотеке также есть несколько других проблем. Попытка официальной сейчас ... документация ужасна. – mpen

9

driver.manage().timeouts().implicitlyWait(ms) функция действительно есть WebdriverJS Reference API Docs. Этот API предназначен для официального Javascript API, который поддерживает Selenium и отрывок @ sircapsalot. Тем не менее, он намного чище, чем смотреть на Google Code и намного проще ориентироваться.

+4

Это на самом деле не ответ на вопрос о webdriver-io. –

+0

эта ссылка не работает, я думаю, что она здесь сейчас: http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Timeouts.html#implicitlyWait – Kayvar