Почему WatiN иногда находит только по идентификатору из ‹TR›?

Я пытаюсь выполнить некоторую веб-автоматизацию, чтобы войти в систему и проверить статус заказа с помощью WatiN на динамически загружаемой веб-странице. Я использую Visual Studio C# Express 2010 и браузер IE.

Несколько фрагментов кода для получения .Text из <TD>, которые вчера отлично работали, больше не работают. Рассматриваемый <TD> содержит <NOBR> и <INPUT>, в этом проблема?

Текст, который мне нужен, также находится в <INPUT>, но тег не имеет определенного атрибута ID или NAME и содержит внутренний текст/значение, которое не совпадает от теста к тесту. Я не могу редактировать данный сайт, иначе это было бы исправлено давным-давно.

Виновник:

public TableCell Status {
    get {
        return Document.TableCell(Find.ById("elementID")); 
    }
}

Другие ячейки таблицы не работают, но текстовые поля и кнопки работают нормально. Я предполагаю, что веб-сайт большой, и WatiN, возможно, время от времени отключается, пытаясь найти элемент. Я был почти уверен, что WatiN выкинул ElementNotFoundException() только после того, как дошел до конца документа. (???)

Элементы формы не загружались полностью для отладки до их достижения, поэтому я подумал, что это может быть проблемой, но все элементы for, которые НЕ были элементами, были загружены правильно, и их существование было верным для всех из них. Кроме того, это просто проблема отладки, и она отлично работала, когда я скопировал .exe на рабочий стол с моими файлами .dll.

Я уже настроил свой отладчик так, чтобы «Включить оценку свойств и другие неявные вызовы функций» был отключен, и это не помогло.

Метод работал, когда я запускал прямой .exe, но не через Visual Studio. Затем он перестал работать, когда я пересобрал тот же самый код и снова скопировал .exe на рабочий стол.

ОБНОВЛЕНИЕ: по-видимому, веб-администратор сайта, к которому нужно подключиться, внес некоторые изменения, которые сломали кучу вещей, так что, может быть, мой код в конце концов в порядке? Я обновлю снова, когда получу от него ответ.


person nicholeous    schedule 10.10.2012    source источник
comment
Вероятно, вы добавили небольшую ошибку при последнем редактировании кода.   -  person Gabber    schedule 12.10.2012
comment
Я не редактировал это, это самое интересное. Он работал, когда я закрыл его на день, а на следующее утро он сломался и не смог прочитать элементы ‹TD›...   -  person nicholeous    schedule 13.10.2012


Ответы (2)


Ну, тогда, может быть, вы можете попробовать что-то вроде:

Document.WaitForComplete();

or

TableCell tc = Document.TableCell(Find.ById("elementID"));
tc.WaitUntilExists();

для того, чтобы tablecell присутствовал?

person t3hn00b    schedule 11.10.2012
comment
Я думаю, что waitUntilExists вызывается после каждого вызова в watin. Обычно я снова вызываю его в своем коде, но он не нужен. - person Gabber; 11.10.2012
comment
Во-первых, спасибо за ваш ответ! Я попробовал обе ваши идеи и столкнулся с парой проблем: WatiN.Core.Document не содержит определения для Document.WaitForComplete(). Однако у него есть функция WaitUntilContainsText("sometext"), которую я вызываю перед получением ячейки таблицы. Текст, который я использую, появляется только тогда, когда появляются ячейки, поэтому я думаю, что это не проблема с загрузкой веб-сайта в браузере. Во втором решении исключение фактически генерируется для Find.ByID("ID"), поэтому tc.WaitUntilExists(); никогда не будет достигнуто. - person nicholeous; 13.10.2012
comment
@ Kizz246 Kizz246, если вы ожидаете, что эта ячейка таблицы будет найдена, вы можете попытаться заключить ее через некоторое время? - person t3hn00b; 15.10.2012
comment
@ t3hn00b Спасибо, однако я думаю, что ожидание этого элемента будет бесконечно вращаться. После того, как он выдает исключение, я считаю, что время ожидания истекло ... поэтому, даже если я помещу его в while(true){ try{ if(page.Status == "OK") //do stuff } catch(Exception e) { continue; } }, оно может продолжаться вечно, время ожидания и перезапуск с нуля в каждом цикле. - person nicholeous; 18.10.2012
comment
Ну, не через какое-то время(правда), а через какое-то время(timeout‹10){что-то; Нить.Сон(2000); тайм-аут++;} - person t3hn00b; 19.10.2012

У меня были проблемы с тем, что различные тестировщики WatiN не могли «видеть» элементы на странице... например, ссылки. Одно исправление, которое я нашел, заключалось в том, чтобы открыть средство запуска тестов под учетной записью с повышенными разрешениями.

person MoMo    schedule 12.10.2012
comment
Спасибо за отзыв! Я не уверен, что вы подразумеваете под тестовым бегуном. Если вы имеете в виду мой автоматический регистратор WatiN, то он уже работает под моей учетной записью администратора. :( Если вы имеете в виду то, на чем я тестирую свой код, я использую VS Debugger, который, как я думаю, тоже работает с правами администратора. :(( - person nicholeous; 13.10.2012
comment
... под средством запуска тестов я имею в виду инструмент, который фактически выполняет ваши тесты (консоль NUnit, Gallio Icarus, TestDriven.Net, встроенный инструмент запуска тестов Visual Studio и т. д.). Иногда средство запуска тестов также позволяет вам выполнять отладку. Кстати, приятно использовать 'logger-inner', когда мы обсуждаем термины и определения;) Это заставило меня рассмеяться. - person MoMo; 16.10.2012