Тест Web-приложений
#1
Отправлено 23 ноября 2007 - 14:58
Задача: оттестить веб-приложение.
Первый вопрос:
на странице есть таблица, в которой есть несколько столбцов, в которых есть несколько ссылок. дальше по этим ссылкам приблизительно такиеже страницы, до 3-го уровня.
Как бы мне пробежатся по всем этим ссылкам и сохранить результат там где я смогбы его прочитать и оценить?
Зарание благодарен.
#2
Отправлено 23 ноября 2007 - 15:26
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#3
Отправлено 23 ноября 2007 - 20:59
Итак, проявляются 2 подзадачи:на странице есть таблица, в которой есть несколько столбцов, в которых есть несколько ссылок. дальше по этим ссылкам приблизительно такиеже страницы, до 3-го уровня.
Как бы мне пробежатся по всем этим ссылкам и сохранить результат там где я смогбы его прочитать и оценить?
1) Перебрать все ссылки
2) Записать результаты в некоторый свой формат
Первая задача решается так:
Вам нужно извлечь все ссылки на данной странице и для каждой из них сделать следующие действия
- Нажать на ссылку
- Дождаться загрузки страницы
- Проверить, что действительно что-то загрузилось
- Извлечь все ссылки и повторить вышеуказанные шаги до тех пор, пока не будет достигнута нужная глубина
[+] LIST OF WINDOW GetLinks( WINDOW wParent ) [ ] LIST OF WINDOW lwLinks = {} [ ] WINDOW wWin [ ] WINDOW wChild [ ] [+] for each wWin in wParent.GetChildren() [+] if( wWin.GetClass() == HtmlLink ) [ ] ListAppend( lwLinks , wWin ) [+] else [+] for each wChild in wWin.GetChildren() [ ] lwWins = lwWins + GetLinks( wChild ) [ ] return lwLinksЕсли устранить конкретику, то у нас есть некоторая активная страница некоторого активного окна браузера, соответственно, все ссылки мы извлечем так:
[ ] LIST OF WINDOW lwLinks [ ] Browser.SetActive() [ ] lwLinks = GetLinks( BrowserPage )То есть мы оперируем только конкретным окном браузера и только активной страницей.
Так мы получаем список ссылок. Нажатие на ссылку осуществляется методом Click.
Загрузки страницы мы можем ждать с помощью Browser.WaitForReady(). Данный вызов как раз ожидает, пока страница догрузится полностью. По умолчанию ожидание занимает 3 минуты (этого более чем достаточно).
А проверить, что реально что-то загрузилось - это уже зависит от конкретных требований. В частности, для того, чтобы проверить, что ссылка просто не является битой, достаточно проверить, что после Browser.WaitForReady() значение BrowserPageNotFound.bExists вернет FALSE (то есть выскочила некоторая страница, а не сообщение, что нет такой страницы). Если же появилась такая страница, то мы рапортуем об ошибке. Эта часть алгоритма реализуется в виде
[ ] WINDOW wWin [ ] [-] for each wWin in lwLinks [ ] Print("Navigating link {wWin.GetText()}. URL: {wWin.GetLocation()}") [ ] wWin.Click() [ ] Browser.WaitForReady() [-] if( BrowserPageNotFound.bExists ) [ ] Log.Error("Failed") [ ] Browser.Back.Click() [ ] Browser.WaitForReady()И самое интересное - аналогичные действия надо повторить для всех ссылок на странице, которая загрузилась. Причем это делается до некоторого уровня вложенности. Опять рекурсия. И это делается так:
[+] VOID CheckLinks( INTEGER iDepth ) [ ] WINDOW wWin [ ] [+] if( iDepth <= 0 ) [ ] return [ ] Browser.SetActive() [ ] [+] for each wWin in GetLinks( BrowserPage ) [ ] Print("Navigating link {wWin.GetText()}. URL: {wWin.GetLocation()}") [ ] wWin.Click() [ ] Browser.WaitForReady() [+] if( BrowserPageNotFound.bExists ) [ ] Log.Error("Failed") [ ] Browser.Back.Click() [ ] Browser.WaitForReady() [+] else [ ] Print("OK") [ ] CheckLinks( iDepth-1 ) [ ]Вышеприведенная функция в комбинации с GetLinks функцией являются фактически движком системы. Теперь осталось задать старт системе.
Если окон барузера нет, то надо бы его стартовать, если же хотя бы одно окно есть, то нужно его активизировать и перейти на некоторую стартовую страницу и уже начиная с нее прощупывать страницы. Выглядит это примерно так:
[ ] STRING sURL = "www.google.com" // Here is to be your URL [ ] [+] if( !Browser.bExists ) [ ] Browser.Invoke() [ ] Browser.WaitForReady() [ ] Browser.SetActive() [ ] Browser.Navigate( sURL ) [ ] [ ] CheckLinks( 3 )Примерно вот так в конечном итоге выглядит перебор всех ссылок до глубины 3.
Вторая задача попроще. Главное - зафиксировать имя файла в некоторой глобальной переменной, например STRING g_sFile
Затем надо просто определить свои функции логирования (аналоги Print, LogError, LogWarning). Например, это можно сделать так:
[+] VOID MyPrint( varargs OF ANYTYPE laValue ) [ ] STRING sResult [ ] ANYTYPE aValue [ ] [ ] HFILE hFile [ ] [+] for each aValue in laValue [ ] sResult += "{sValue}" [ ] [ ] hFile = FileOpen( g_sFile , FM_APPEND ) [ ] FileWriteLine( hFile , sResult ) [ ] FileClose( hFile ) [ ] [+] VOID MyWarning( STRING sMessage ) [ ] hFile = FileOpen( g_sFile , FM_APPEND ) [ ] FileWriteLine( hFile , "WARNING!!!:" + sMessage ) [ ] FileClose( hFile ) [ ] [+] VOID MyError( STRING sMessage ) [ ] hFile = FileOpen( g_sFile , FM_APPEND ) [ ] FileWriteLine( hFile , "Error!!!:" + sMessage ) [ ] FileClose( hFile )Эти функции являются заменителями функций Print, LogWaring, LogError соответственно. Достаточно просто произвести замену стандартных функций логирования своими и получим вывод в некоторый свой файл. Формат уже можно подобрать по вкусу.
Вот примерно так это решается
P.S.: Этот код взят просто из головы и отладки не производилось, поэтому что-то может работать не так, но принцип все-равно отражен.
#4
Отправлено 26 ноября 2007 - 14:09
У меня появились некоторые трудноти, просмотри пожалуйста.
1) В данном месте кода возникла ошибка:
[-] for each wWin in wParent.GetChildren() [-] if( wWin.GetClass() == HtmlLink ) [ ] ListAppend( lwLinks , wWin ) [-] else [-] for each wChild in wWin.GetChildren() [ ] lwWins = lwWins + GetLinks( wChild ) [ ] return lwLinks
А именно к строке, for each wChild in wWin.GetChildren(), если sURL = "www.google.com" пишит:
[ ] *** DefaultBaseState is setting Browser active, No window was active
[ ] *** Error: Window '[HtmlPushButton]&name='btnG'' was not found
[ ] Occurred in BrowserPage.HtmlPushButton("&name='btnG'")::GetChildren
2) Когда начинаем проверять все линки, я нехочу logout-иться, и изменил код чтобы не активировать эту ссылку:
[-] for each wWin in GetLinks( BrowserPage ) [ ] Print("Navigating link {wWin.GetText()}. URL: {wWin.GetLocation()}") [-] if (wWin.GetText()!="Вихід") [ ] wWin.Click() ......................................................... [-] else [ ] Print ("I'm not out") [ ] CheckLinks( iDepth-1 )
Но после выполнения он выдает:
[-] Testcase GetAllLinks2 - Passed
[ ] *** DefaultBaseState is setting Browser active, No window was active
[ ] Navigating link Вихід. URL: http://192.168.3.150:8082/logout.php
Т.е. или я что-то не то делаю, или он только одну ссылку видит.
3) На текст Log.Error("Failed") у Cилка однозначная реакция: Variable Log is not defined.
#5
Отправлено 26 ноября 2007 - 14:28
DefaultBaseState и ошибка, связанная с ним, к данному участку кода никакого отношения не имеет. В самом начале кода встявьте строчки вида:Огромное спосибо за столь исчерпывающий ответ.
У меня появились некоторые трудноти, просмотри пожалуйста.
1) В данном месте кода возникла ошибка:[-] for each wWin in wParent.GetChildren() [-] if( wWin.GetClass() == HtmlLink ) [ ] ListAppend( lwLinks , wWin ) [-] else [-] for each wChild in wWin.GetChildren() [ ] lwWins = lwWins + GetLinks( wChild ) [ ] return lwLinks
А именно к строке, for each wChild in wWin.GetChildren(), если sURL = "www.google.com" пишит:
[ ] *** DefaultBaseState is setting Browser active, No window was active
[ ] *** Error: Window '[HtmlPushButton]&name='btnG'' was not found
[ ] Occurred in BrowserPage.HtmlPushButton("&name='btnG'")::GetChildren
[+] if( !Browser.Exists() ) [ ] Browser.Invoke() [ ] Browser.SetActive()
А затем уже перейдите на нужный сайт (Browser.Navigate( <Some URL> ) ).
Насчет вот этого
[ ] *** Error: Window '[HtmlPushButton]&name='btnG'' was not found
попробуйте у этой кнопки сделать тэг
$btnG
Это более надежно и не конфликтует с предыдущими версиями Силка (приведенный в вашем примере вариант тега появился в поздних версиях)
Попробуйте линк идентифицировать по какому-то другому признаку, например, его Window ID (для этого есть метод GetID() )2) Когда начинаем проверять все линки, я нехочу logout-иться, и изменил код чтобы не активировать эту ссылку:
[-] for each wWin in GetLinks( BrowserPage ) [ ] Print("Navigating link {wWin.GetText()}. URL: {wWin.GetLocation()}") [-] if (wWin.GetText()!="Вихід") [ ] wWin.Click() ......................................................... [-] else [ ] Print ("I'm not out") [ ] CheckLinks( iDepth-1 )
Но после выполнения он выдает:
[-] Testcase GetAllLinks2 - Passed
[ ] *** DefaultBaseState is setting Browser active, No window was active
[ ] Navigating link Вихід. URL: http://192.168.3.150:8082/logout.php
Т.е. или я что-то не то делаю, или он только одну ссылку видит.
Прошу прощения, это я ошибся. Там должно быть LogError, просто я по аналогии с ТестКомплитом создал класс для логирования, вот и пользуюсь.3) На текст Log.Error("Failed") у Cилка однозначная реакция: Variable Log is not defined.
#6
Отправлено 27 ноября 2007 - 12:12
[codebox]
[-] VOID GetCh (WINDOW BrPage)
[ ] LIST OF WINDOW wList
[ ] WINDOW wC
[ ] wList = BrPage.GetChildren()
[ ]
[-] for each wC in wList
[ ] Print ("Class: {wC.GetClass()}.")
[-] if ( wC.GetClass() == HtmlLink )
[ ] Print ("Navigation link {wC.GetText()}. URL: {wC.GetLocation()}")
[/codebox]
При выполнении данного кода для URL:"www.ya.ru" видит только одну таблицу, а ссылок не видит.
#7
Отправлено 27 ноября 2007 - 12:25
К "вопросу о" : потому что в приведенном коде недостаточно рекурсии. Браузер содержит страничку, страница - таблицу, таблица - колонки, а уже в колонках (возможно!) находятся линки. Это значит нужно 3 раза GetChildren (считая от страницы), а не 1. Попробуйте прочитать мануалы к тестированию веб-приложений и немного пораспознавать их
#8
Отправлено 27 ноября 2007 - 13:15
Вы посмотрите в моем примере функцию GetLinks и посмотрите, в чем разница. У меня там еще дальше рассматривается случай, если текущих элемент не является ссылкой. В этом случае у данного объекта перебираются ссылки и для каждого объекта рекурсивно вызывается GetLinks. Так вы извлечете только ссылки на первом уровне иерархииПожалуйста скажите в чем тут фокус:
[-] VOID GetCh (WINDOW BrPage) [ ] LIST OF WINDOW wList [ ] WINDOW wC [ ] wList = BrPage.GetChildren() [ ] [-] for each wC in wList [ ] Print ("Class: {wC.GetClass()}.") [-] if ( wC.GetClass() == HtmlLink ) [ ] Print ("Navigation link {wC.GetText()}. URL: {wC.GetLocation()}")
При выполнении данного кода для URL:"www.ya.ru" видит только одну таблицу, а ссылок не видит.
#9
Отправлено 27 ноября 2007 - 13:25
К "вопросу о" : потому что в приведенном коде недостаточно рекурсии. Браузер содержит страничку, страница - таблицу, таблица - колонки, а уже в колонках (возможно!) находятся линки. Это значит нужно 3 раза GetChildren (считая от страницы), а не 1.
Благодарю, совет пришелся кстати , нашел все линки:
[-] VOID wDeeper (WINDOW wParent) [ ] WINDOW wCh [-] for each wCh in wParent.GetChildren() [ ] Print ("Class: {wCh.GetClass()}") [-] if ( wCh.GetClass() == HtmlLink ) [ ] Print ("Navigation link {wCh.GetText()}. URL: {wCh.GetLocation()}") [-] else [ ] wDeeper (wCh)
#10
Отправлено 27 ноября 2007 - 13:27
Ну не надо так резко. Поскольку в большинстве случаев люди изучают силктест, потому как предвидится проект и нужно в ближайшее время самостоятельно обучиться по мере возможностей (а возможности ограничены временными рамками и опытом работы с подобными системами), то ничего удивительного, что на подумать и поразмыслить, когда даже работающих примеров нет, весьма затруднительно. Поэтому-то люди и идут сюда в поисках помощи..... странно, KaNoN с самого начала написал, что его код - это всего лишь базис для дальнейшего развития и он его даже не компилил и не проверял на реальных данных. Так почему же до сих пор у Вас, Al*GatoR, всё никак не включится собственный источник логики ?
to Al*GatoR:
А GetLinks таки не удалось наладить? Эта функция не привязана к какому-то конкретному окну и не меняет состояния приложения. Вроде проблем быть не должно
#11
Отправлено 27 ноября 2007 - 13:38
Вы посмотрите в моем примере функцию GetLinks и посмотрите, в чем разница. У меня там еще дальше рассматривается случай, если текущих элемент не является ссылкой. В этом случае у данного объекта перебираются ссылки и для каждого объекта рекурсивно вызывается GetLinks. Так вы извлечете только ссылки на первом уровне иерархии
Спосибо за время которое вы испльзуете для ответов на мои вопросы. Я незнаю почему в этом коде он видит только те ссылки которые наповерхности или заканчивает свой поиск на первой попавшейся и не продалжает дальше искать вложенные ссылки в таблице на даной странице, а таким образом как я выложил, ссылаясь на ваш пример, выше находит все линки во всех таблицах на странице.
#12
Отправлено 28 ноября 2007 - 14:38
[ ] *** Error: Window '[HtmlPopupList]&name='MONTH'' was not found
[ ] Occurred in BrowserPage.HtmlPopupList("&name='MONTH'")::GetChildren
решил вопрос строкой if ( wCh.GetClass() != HtmlPopupList ) (просто пропуск таких классов)
[ ] *** Error: Window '[HtmlPushButton]&name='CALC'' was not found
[ ] Occurred in BrowserPage.HtmlPushButton("&name='CALC'")::GetChildren
решение аналогичное предыдущему
[ ] *** Error: Window '[HtmlColumn]&id='CT'' was not found
[ ] Occurred in BrowserPage.HtmlTable("Сортування:").HtmlColumn("&id='CT'")::GetChildren
эту проблему решить по аналогии я немогу поскольку в этом Column-е есть нужные мне ссылки, хотя в этомже тесткейсе только на Page-ах уровня выше Column-ы нормально было видно. Подазреваю что проблема из-за динамичности таблицы.
Потом я решил попробовать этот тесткейс на странице "Google" c найденным словом "Hello", появились такие ошибки:
[ ] *** Error: Window '[HtmlHidden]&name='hl'' is not unique, attributes match for multiple items.
[ ] Occurred in BrowserPage.HtmlHidden("&name='hl'")::GetChildren
[ ] *** Error: Window '[HtmlTextField]&name='q'' is not unique, attributes match for multiple items.
[ ] Occurred in BrowserPage.HtmlTextField("&name='q'")::GetChildren
[ ] *** Error: Window '[HtmlRadioList]&id='all';name='lr'' is not unique, attributes match for multiple items.
[ ] Occurred in BrowserPage.HtmlRadioList("&id='all';name='lr'")::GetChildren
[ ] *** Error: Window '[HtmlText]^После 16 лет совместной жизни они приняли решение о разводе. В эксклюзивном интервью ! знаменитые фигуристы рассказали, почему' was not found
[ ] Occurred in BrowserPage.HtmlText("^После 16 лет совместной жизни они приняли решение о разводе. В эксклюзивном интервью ! знаменитые фигуристы рассказали, почему")::GetChildren
[ ] *** Error: Window '[HtmlLink]Политика конфиденциальности' is not unique
[ ] Occurred in GetLocation
Эти ошибки я методично устранял, как и прежде, но ведь как раз "HtmlLink" этот класс мне и нужен, я немогу и его игнорировать.
Что можете посаветовать?
#13
Отправлено 28 ноября 2007 - 15:27
На Вашем месте я бы сделал так:
ограничил бы в рекурсии поиск подобъектов классами HtmlText, HtmlTable,HtmlColumn. А для каждого из них делал бы динамическое конструирование линков :
LIST OF WINDOW GetPossibleLinks (window wSomeHtml) LIST OF WINDOW lwResult INTEGER i = 1 window wLink = wSomeHtml.HtmlLink("#{i++}") while wLink.Exists () lwResult += {wLink} wLink = wSomeHtml.HtmlLink("#{i++}") return lwResultесли этот список пустой - значит линков нет, идём дальше.
#14
Отправлено 28 ноября 2007 - 16:34
мне вообще кажется ошибочным ЛЮБОЙ метод, который связан с GetChildren() (но т.к. похоже у меня с KaNoN-ом тут холивар, то я до последнего об этом молчал...)
я вообще-то стараюсь в ваши холивары не встревать, но тут соглашусь, что этот вариант все же лучше, чем GetChildren() .
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#15
Отправлено 28 ноября 2007 - 18:37
У GetChildren-а основная проблема в его тормознутости. Но эту тормознутость я свел к минимуму (не зря же я его использую в for each). Насчет вышеприведенного примера - это неплохое решение. Но вот все равно надо как-то дочерние окна перебирать.мне вообще кажется ошибочным ЛЮБОЙ метод, который связан с GetChildren() (но т.к. похоже у меня с KaNoN-ом тут холивар, то я до последнего об этом молчал...)
я вообще-то стараюсь в ваши холивары не встревать, но тут соглашусь, что этот вариант все же лучше, чем GetChildren() .
#16
Отправлено 28 ноября 2007 - 19:09
Гулять так гулятьмне вообще кажется ошибочным ЛЮБОЙ метод, который связан с GetChildren() (но т.к. похоже у меня с KaNoN-ом тут холивар, то я до последнего об этом молчал...)
На Вашем месте я бы сделал так:
ограничил бы в рекурсии поиск подобъектов классами HtmlText, HtmlTable,HtmlColumn. А для каждого из них делал бы динамическое конструирование линков :LIST OF WINDOW GetPossibleLinks (window wSomeHtml) LIST OF WINDOW lwResult INTEGER i = 1 window wLink = wSomeHtml.HtmlLink("#{i++}") while wLink.Exists () lwResult += {wLink} wLink = wSomeHtml.HtmlLink("#{i++}") return lwResultесли этот список пустой - значит линков нет, идём дальше.
[+] LIST OF WINDOW GetLinks( WINDOW wParent ) [ ] INTEGER i = 1 [ ] LIST OF WINDOW lwResult = {} [ ] [+] while( wParent.AnyWin("#{i}").bExists ) [+] if( wParent.AnyWin("#{i}").GetNativeClass() == "HtmlLink" ) [ ] ListAppend( lwResult , wParent.AnyWin("#{i}") ) [+] else [ ] lwResult += GetLinks( wParent.AnyWin("#{i}") ) [ ] i++ [ ] [ ] return lwResultСнова тормознутый, но схватит все ссылки на странице. Единственный недостаток всего решения, которое я предоставил - это то, что изначально предполагается, что каждая ссылка осуществляет переход на другую страницу. Но если по ссылке срабатывает клиентский скрипт (например мы выбрали меню и выскочил подпункт), то в этом месте произойдет слет с рельс (что видимо и произошло).
Как еще один вариант, стоит посмотреть такую утилитку как Link Tester, которую можно активировать, выбрав в Силке меню Tools > Link Tester, он как раз извлекает список ссылок до некоторого уровня вложенности. Может быть с ним что-то удастся сделать
#17
Отправлено 29 ноября 2007 - 09:16
[+] LIST OF WINDOW GetLinks( WINDOW wParent ) [ ] INTEGER i = 1 [ ] LIST OF WINDOW lwResult = {} [ ] [+] while( wParent.AnyWin("#{i}").bExists ) [+] if( wParent.AnyWin("#{i}").GetNativeClass() == "HtmlLink" ) [ ] ListAppend( lwResult , wParent.AnyWin("#{i}") ) [+] else [ ] lwResult += GetLinks( wParent.AnyWin("#{i}") ) [ ] i++ [ ] [ ] return lwResultСнова тормознутый, но схватит все ссылки на странице. Единственный недостаток всего решения, которое я предоставил - это то, что изначально предполагается, что каждая ссылка осуществляет переход на другую страницу. Но если по ссылке срабатывает клиентский скрипт (например мы выбрали меню и выскочил подпункт), то в этом месте произойдет слет с рельс (что видимо и произошло).
Как еще один вариант, стоит посмотреть такую утилитку как Link Tester, которую можно активировать, выбрав в Силке меню Tools > Link Tester, он как раз извлекает список ссылок до некоторого уровня вложенности. Может быть с ним что-то удастся сделать
Что-то никак ниполучается достучатся до ссылок находящихся в динамически формирующейся таблице на PHP.
Link Tester тоже там ничего невидит.
#18
Отправлено 29 ноября 2007 - 09:40
Это, пожалуй, самое универсальное решение (перебирает вообще всё, что есть на данный момент). Возможно нехватает где-то синхронизации, что приводит к тому, что некоторые ссылки пока что не видны. Опять же, если есть ссылки, которые просто осуществляют переход внутри страницы или запускают какой-то клиентский скрипт, то такая ситуация не отслеживается и вполне возможно, что вы уже работаете не с той формой. Тут надо просто отслеживать эти ситуации. Посмотрите, не было ли выброса из текущей страницы, когда ссылки ищутся для одной страницы, а фактически активна другая?[+] LIST OF WINDOW GetLinks( WINDOW wParent ) [ ] INTEGER i = 1 [ ] LIST OF WINDOW lwResult = {} [ ] [+] while( wParent.AnyWin("#{i}").bExists ) [+] if( wParent.AnyWin("#{i}").GetNativeClass() == "HtmlLink" ) [ ] ListAppend( lwResult , wParent.AnyWin("#{i}") ) [+] else [ ] lwResult += GetLinks( wParent.AnyWin("#{i}") ) [ ] i++ [ ] [ ] return lwResultСнова тормознутый, но схватит все ссылки на странице. Единственный недостаток всего решения, которое я предоставил - это то, что изначально предполагается, что каждая ссылка осуществляет переход на другую страницу. Но если по ссылке срабатывает клиентский скрипт (например мы выбрали меню и выскочил подпункт), то в этом месте произойдет слет с рельс (что видимо и произошло).
Как еще один вариант, стоит посмотреть такую утилитку как Link Tester, которую можно активировать, выбрав в Силке меню Tools > Link Tester, он как раз извлекает список ссылок до некоторого уровня вложенности. Может быть с ним что-то удастся сделать
Что-то никак ниполучается достучатся до ссылок находящихся в динамически формирующейся таблице на PHP.
Link Tester тоже там ничего невидит.
ЗЫ: Это мой 666-й пост в этом форуме. Теперь я АЦЦКИЙ СОТОНА
#19
Отправлено 29 ноября 2007 - 11:22
Это, пожалуй, самое универсальное решение (перебирает вообще всё, что есть на данный момент). Возможно нехватает где-то синхронизации, что приводит к тому, что некоторые ссылки пока что не видны. Опять же, если есть ссылки, которые просто осуществляют переход внутри страницы или запускают какой-то клиентский скрипт, то такая ситуация не отслеживается и вполне возможно, что вы уже работаете не с той формой. Тут надо просто отслеживать эти ситуации. Посмотрите, не было ли выброса из текущей страницы, когда ссылки ищутся для одной страницы, а фактически активна другая?
Link-и в динамической таблице все ссылаются на другие страницы. Выброса из текущей страницы не наблюдается.
Думаю что буду обращатся к конкретной таблице с конкретным индексом.
[-] VOID CheckL (WINDOW wSomeHtml) [ ] INTEGER iTable = 1 [ ] INTEGER iColumn =1 [ ] INTEGER iLink = 1 [ ] STRING wParent = wSomeHtml.GetLocation() [ ] [-] while BrowserPage.HtmlTable("#{iTable}").bExists //.HtmlColumn("#{iColumn}").HtmlLink("#{iLink}").bExists [ ] iColumn = 1 [-] while BrowserPage.HtmlTable("#{iTable}").HtmlColumn("#{iColumn}").bExists //.HtmlLink("#{iLink}").bExists [ ] iLink = 1 [-] while BrowserPage.HtmlTable("#{iTable}").HtmlColumn("#{iColumn}").HtmlLink("#{iLink}").bExists [ ] Print ("Table ( #{iTable} ) / Column ( #{iColumn} ) / Link ( #{iLink} )") [ ] BrowserPage.HtmlTable("#{iTable}").HtmlColumn("#{iColumn}").HtmlLink("#{iLink}").Click() [ ] Browser.WaitForReady() [ ] Print ("Ok.") [ ] Browser.Navigate( wParent ) [ ] Browser.WaitForReady() [ ] iLink++ [ ] iColumn++ [ ] iTable++
Правда придется учитывать возможность вложеных таблиц.
#20
Отправлено 29 ноября 2007 - 13:15
ЗЫ: Это мой 666-й пост в этом форуме. Теперь я АЦЦКИЙ СОТОНА
Сделать персональный статус рядом с ником?
Редактор портала www.it4business.ru
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных