Перейти к содержимому

Фотография

Работа с Item


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 Deus

Deus

    Новый участник

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 09 ноября 2006 - 16:27

Доброго времени суток! :blush:
Задача. Есть немаленький портал с львиной долей бизнес логики и громадными запросами к базе данных. На странице порядка 3000-4000 всяких Item'ов.
После написания такого кода:
myValue = myPage.Item("myItem").firstChild.nodeValue
Результат получался "через раз".
По совету уважаемого Dmitry_N было переписано тоже самое, но с WaitItem и таймаутом в 10сек.
Не помогло.
Тогда, закралось подозрение, что ТС просто не успевает обновить все Item'ы (3-4 тысячи - немаленькое количество). Код получился примерно следующий:
timeOut = 10000 ' 10sec
  endTime = Win32API.GetTickCount + timeOut
'------------------------------------------------------------------------------------------
  Do While endTime + timeOut > Win32API.GetTickCount
  myPage.Refresh
    myValue = myPage.WaitItem("myItem", timeOut).firstChild.nodeValue 
    if (myValue <> Empty) then Exit Do
  Loop
Аналогичный код на 2000 Item'ов работал всегда. Увеличил таймаут до 20сек- все выполняется. Но в целом скрипт, который сравнивает значения в 2х полях выполняется 2 минуты. Возможно как-то более правильно и быстрее выполнять эти же действия?
  • 0

#2 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 10 ноября 2006 - 16:56

Здравствуйте.

Со страницами, на которых очень много объектов, TestComplete действительно работает не торопясь. Ускорить работу можно используя нативные свойства и методы объектов веб страницы - в таком случае TestComplete не будет строить дерево объектов, что занимает много времени. Недостатком является необходимость написания заменителей методов, добавляемых объектам TestComplete'ом (например Click). Пример использования нативных методов можно найти здесь.

Кстати, следующий ваш код отрабатывает сразу два таймаута (20 сек.).
timeOut = 10000 ' 10sec
 endTime = Win32API.GetTickCount + timeOut
'------------------------------------------------------------------------------------------
 Do While endTime + timeOut > Win32API.GetTickCount

  • 0
С уважением,
Дмитрий

#3 Deus

Deus

    Новый участник

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 13 ноября 2006 - 12:55

Здраствуйте :friends:

У объекта document есть коллекции. TC в object browser'e отображает только коллекции all & frames. И для них написаны всякие Click'и. А все остальные получаются нативными объектами и методы добавляемые ТС уже не работают, так?

Вопрос 2, если у меня большое количетво Item'ов, то мне не стоит же работать с коллекией all ? Или как?
Если я напишу: myPage.document.all.Item(42) то ТС будет по порядку добираться, откроет страницу, на ней документ, потом коллекцию all и тут у меня начнуться тормоза из-за количества этих всех итемов?
  • 0

#4 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 13 ноября 2006 - 14:47

Здравствуйте.

У объекта document есть коллекции. TC в object browser'e отображает только коллекции all & frames. И для них написаны всякие Click'и. А все остальные получаются нативными объектами и методы добавляемые ТС уже не работают, так?

Нет, методы Click и другие добавляются всем объектам, отображаемым в Object Browser. Однако если вы получите не тот объект, который отображён в Object Browser, а нативный объект, то он не будет иметь этих свойст и методов. Объекты, отображённые в Object Browser являются обёртками для нативных объектов.

Вопрос 2, если у меня большое количетво Item'ов, то мне не стоит же работать с коллекией all ? Или как?
Если я напишу: myPage.document.all.Item(42) то ТС будет по порядку добираться, откроет страницу, на ней документ, потом коллекцию all и тут у меня начнуться тормоза из-за количества этих всех итемов?

Да, как только вы "попросите" любой из дочерних объектов объекта all, TestComplete начнёт строить дерево всех дочерних объектов объекта all. Только после построения дерева он сможет решить, какой объект надо возвращать.
  • 0
С уважением,
Дмитрий

#5 Deus

Deus

    Новый участник

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 14 ноября 2006 - 11:35

Hi! :friends:

Тогда вопросы:
1. Возможно ли работать в ТС с другими коллекциями кроме all & frames? И будут ли работать свойства и методы ТС, такие как Click? или это уже будут нативные объекты, на которых они не работают.
2. Как работать с нативными html объектами, которые содержаться в таблице, в обход коллекции all?

Также пытался найти мой объект вот так:
Set  myObj = myPage.document.getElementbyId("elementName")

  • 0

#6 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 14 ноября 2006 - 15:04

Здравствуйте.

1. Возможно ли работать в ТС с другими коллекциями кроме all & frames? И будут ли работать свойства и методы ТС, такие как Click? или это уже будут нативные объекты, на которых они не работают.

С этими и другими коллекциями вы можете работать как с нативными объектами. Для этого "попросить" их надо не у объекта Page, а у объекта 'Window("Internet Explorer_Server").Document'. Можете посмотреть на него в Object Browser. 'Document' в данном случае это свойство объекта 'Internet Explorer_Server'.

2. Как работать с нативными html объектами, которые содержаться в таблице, в обход коллекции all?

Взять объект таблицы (как угодно, например через getElementByID), а затем пользоваться его нативными свойствами (например Rows, Cells, и т.д.). На свойства и методы объекта таблицы тоже можно посмотреть в Object Browser.
  • 0
С уважением,
Дмитрий

#7 Deus

Deus

    Новый участник

  • Members
  • Pip
  • 61 сообщений
  • ФИО:Гапченко Алексей Владимирович
  • Город:Украина, Харьков

Отправлено 18 ноября 2006 - 09:38

Спасибо за все советы - очень помогли. Разобрался с работой с нативными объектами - летает в 5 раз быстрее :))
Для себя сделал выводы насчет работы с определенными элементами на странице (может кому еще пригодиться):
1. Если ссылка, то лучше работать с коллекцией document.links - есть метод click()
2. Если элемент находиться в таблице, то применяем метод document.getElementById("tableId"), затем в цикле перебираемся по rows(i).cells(j)
3. Если text-box, то смотрим в исходниках Id и читаем/записываем document.getElementById("Id").value
4. Если надпись в innerHTML в виде текста: document.getElementById("Id").firstChild.nodeValue
5. Если кнопка, то аналогично все, только иногда нужно сначало фокус на нее поставить, чтобы корректно сработала обработка события.
document.getElementById("buttonId").focus
document.getElementById("buttonId").click

Ниже двойной щелчек, может кому пригодиться для работы с html объектами.
Sub DblClickObj(myPage, myObj)    
  myObj.scrollIntoView(false)
  Set objRect = myObj.getBoundingClientRect()
  x = myPage.ScreenLeft + objRect.Left + (ObjRect.Right - ObjRect.Left) / 2
  y = myPage.ScreenTop + objRect.Top + (ObjRect.Bottom - ObjRect.Top) / 2 
  Sys.Desktop.MouseDown Win32API.VK_LBUTTON, x, y  
  Sys.Desktop.MouseUp Win32API.VK_LBUTTON, x, y
  Sys.Desktop.MouseDown Win32API.VK_LBUTTON, x, y
  Sys.Desktop.MouseUp Win32API.VK_LBUTTON, x, y
End Sub

  • 0

#8 objective

objective

    Новый участник

  • Members
  • Pip
  • 47 сообщений

Отправлено 08 декабря 2006 - 11:38

Спасибо
Ваши замечания, особенно о links помогли.

PS. Где кнопка Thanks?
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных