Watir медленный на вложенных таблицах - PullRequest
0 голосов
/ 17 июня 2011

Я использую watir-webdriver, чтобы вычистить страницу с макетом на основе вложенной таблицы.Например, я создал очень маленький игрушечный сайт по адресу http://veryslow.staticloud.com/.. Для поиска самой внутренней таблицы, содержащей элементы СССР и Бразилии, я использую следующий код:

require "rubygems"
require "watir-webdriver"
r = Watir::Browser.new
br.goto("http://veryslow.staticloud.com/")
reg = /USSR.+Brazil/m
mytable = br.table(:text,reg).table(:text,reg).table(:text,reg).table(:text,reg).table(:text, reg).table(:text, reg)
mytable.text

У меня естьдва вопроса:

  1. Есть ли лучший способ поиска этих внутренних таблиц?
  2. Почему это так медленно?Чтобы действительно найти таблицу (это делается, когда я звоню mytable.text), требуется значительное количество времени.Для сложных веб-сайтов с макетом на основе вложенных таблиц это мучительно долго.

Я знаю, что дизайн вложенных таблиц - плохая идея, но если вам нужно читать с них, есть ли более быстрый способчто?

Ответы [ 5 ]

1 голос
/ 03 июля 2011

Всякий раз, когда вы используете Regexp для поиска элементов, мы должны выполнять фильтрацию на стороне Ruby, а не в самом браузере. Это означает, что каждый раз, когда вы вызываете здесь .table (: text, reg), мы находим все таблицы внутри содержащего элемента и фильтруем их в Ruby, чтобы найти таблицу, которая соответствует регулярному выражению. Это будет медленно, особенно с такой страницей.

1 голос
/ 18 июня 2011

Есть ли шанс, что разработчики назначат имя или класс таблицам, строкам или ячейкам хотя бы на основе позиции или чего-то еще?или его функция в этом месте?я думаю, что таким образом вы могли бы сделать что-то вроде поиска ячейки с классом originating_city и текстом «New York» и т. д. как есть, у вас есть тестовое минное поле, и если вы можетеЕсли бы я не сотрудничал с разработчиками, чтобы это можно было проверить, я бы серьезно занялся обновлением вашего резюме и поиском новой позиции, прежде чем она загорелась.

В вашем конкретном примере вы можете попробовать использовать.parent, так как во всей таблице есть только одна ячейка с СССР ... но это плохо работает для любого другого названия города, такого как Бразилия.

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

1 голос
/ 18 июня 2011

До сих пор мне удалось выяснить, что xpath - лучший способ сделать это для известных структур страниц.Итак, что-то вроде

mytable = br.table(:xpath,"/html/body/table/tbody/tr[3]/td/table/tbody/tr[3]/td/table[2]/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td[3]/table")

обычно намного быстрее.

0 голосов
/ 09 июля 2011

Посмотрите, можете ли вы найти какие-либо атрибуты, по которым можно найти таблицу.

mytable = br.table (: xpath, "/ html / body / table / tbody / tr [3] / td / table / tbody / tr [3] / td / table [2] / tbody /tr / td / table / tbody / tr / td [2] / table / tbody / tr [3] / td [3] / table ")

Будет работать намного лучше и будет менее хрупким, если вы напишите егонапример, mytable = br.table (: xpath, "// table [@ name = 'sometablename']")

Иногда элементы пользовательского интерфейса, как правило, имеют динамические идентификаторы, которые меняются при каждом обновлении страницы, например, например, id = 'xyz12345 'изменяется на id =' abc475843 'после обновления.В этом случае вы можете набрать скорость, проанализировав br.html с помощью Nokogiri или Hpricot (хотя для Nokogiri предпочтительнее Hpricot).

0 голосов
/ 20 июня 2011

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

В противном случае ... не совсем.Если что-то не определило внутреннюю таблицу (или ее родительский / дочерний элемент), которая исключена из внешней таблицы, ее трудно идентифицировать.

...