У меня есть некоторый код, который выполняет имитацию обхода дерева рекурсии, чтобы вычистить материал из дерева HTML с помощью SeleniumRC.Я запустил код с использованием локаторов Xpath и CSS.
Дерево представлено в виде серии вложенных таблиц.Если это вообще имеет значение, часть содержимого дерева начинает невидима, поскольку ветви «свернуты».И для Xpath, и для CSS дерево находится в одном и том же состоянии с точки зрения видимого и невидимого.
Чтобы получить значения узлов, мой код начинается с выражения "root", добавляет токены "branch", которые могутувеличиваться для каждого последующего узла-брата, а затем использовать токен «узла» для получения текстового содержимого.
Все это работает, но гораздо медленнее, используя выражения CSS, которые я придумала.
Полагаю, это хитрый способ создания выражений локатора, хотя он работает для моих целей.Я просто пытаюсь выяснить, как наилучшим образом использовать CSS, чтобы приблизиться к временам, связанным с использованием Xpath.
Цикл проверяет множество недопустимых выражений (продолжает поиск n-го родственного брата, пока не найден), и выражения получают действительнодолго, из-за способа, которым я постепенно увеличиваю детализацию во вложенных таблицах.
Ниже следуют биты выражения и примеры, которые приходят из рекурсии.Если кто-то может дать некоторое представление о том, что я делаю, так это то, что CSS занимает намного больше времени, чем Xpath, это было бы очень полезно.
Я совершенно новичок в этом виде манипулирования контентом HTML,если вы видите что-то глупое с точки зрения того, как я перешел с Xpath на CSS, скажите, пожалуйста.
XPath «токены»:
final String rootbase = "//*[contains(@id,\"treeBox\")]/div";
// in next string, "{branchIncrement}" will be replaced with integer values from 2 to get to text content, and skip graphical elements
final String leveltoken = "/table/tbody/tr[{branchIncrement}]/td[2]";
final String nodetoken = "/table/tbody/tr/td[4]/span";
CSS «токены»:
final String rootbase = "css=[id*=treeBox]>div";
// in next string, "{branchIncrement}" will be replaced with integer values from 2 to get to text content, and skip graphical elements
final String leveltoken = ">table>tbody>tr:nth-child({branchIncrement})>td:nth-child(2)";
final String nodetoken = ">table>tbody>tr>td:nth-child(4)>span";
Первое выражение XPath для содержимого в «корне»:
//*[contains(@id,"treeBox")]/div/table/tbody/tr[2]/td[2]/table/tbody/tr/td[4]/span
Последнее выражение XPath для дерева из 40 узлов с четырьмя уровнями, по три брата на каждом уровне ниже корня (1 + 3 + 3x3 + 3x3x3):
//*[contains(@id,"treeBox")]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[4]/span
Первое выражение CSS:
[id*=treeBox]>div>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr>td:nth-child(4)>span
Последнее выражение CSS:
[id*=treeBox]>div>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr:nth-child(3)>td:nth-child(2)>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr:nth-child(2)>td:nth-child(2)>table>tbody>tr>td:nth-child(4)>span