2015-07-09 2 views
0

У меня небольшая проблема с xpath в seleniumdriver.xPath в селене с несколькими помещениями в слоях нескольких узлов

Я бы хотел, чтобы xpath-локатор сузил свой выбор двумя переменными, используя точное соответствие в разных точках узла hiearchy. Эта часть выполнена.

Вы можете представить себе мой случай как обращение к двумерному массиву в xml с помощью xPath, причем каждое измерение задается как две переменные, которые у меня есть (они представляют собой стандартный поиск текста через переменные js, а не переменные xpath).

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

Как я могу сформировать выражение, которое не будет делать ту же ошибку? Я пробовал выражение 'и', но обе инструменты selenium и xpath говорят, что значение '1' для 'found', но это не дает мне локатор узлов для работы.

Пример: моя структура выглядит аналогичной, поэтому, обращаясь к ней правильно, x1/y1, например, выглядит нормально.

//x1//y1 
//x1//y2 
//x2//y3 
//x2//y4 
//x3//y5 
//x3//y6 

Должен работать, работает нормально.

//x1x//y1 
//x1x//y2 
//x2x//y3 
//x2x//y4 
//x3x//y5 
//x3x//y6 

(Давать несуществующий вход в качестве 1-го измерения.) Мой вход не является отказоустойчивой, я смотрю на точное значение, так что тесты не здесь, как они должны.

//x2//y1 
//x2//y2 
//x3//y3 
//x3//y4 
//x1//y5 
//x1//y6 

DING локатор находит Y значения здесь, когда он не должен (как у Vales находятся на разных листьях дерева узлов). Мне нужна помощь в этом.

Вот локатор в вопрос:

return element(by.xpath(".//div[@name='typeList']//div[.//text()='" + moduleName + "']//div[./text()='" + typeName + "']")).getText(); 

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

+0

Ваша структура путает меня. Сначала я подумал, что x и y где теги, но в вашем XPath вы ищете текст. Вы знаете, какой из них он находит? – cvesters

+0

Позвольте мне сказать другим способом. Я тестирую, чтобы проверить, что «файлы» находятся в их правильных «каталогах». Значения x в примере - это каталоги, а y - файлы. Я могу найти правильные элементы через их текстовое значение через переменные. Сам х и у - это просто примеры. Они не являются тегами, они представляют собой возможные значения для переменных текстового поиска. – hardcore

+0

Да, я знаю, какой элемент найден. – hardcore

ответ

0

В конце концов, это была синтаксическая проблема перед текстовыми ключевыми словами.

Я пытался это

//div[./text()='Zero']//div[./text()='Number'] 

Вместо этого мне нужно было что-то вроде этого.

//div[.//text()='Zero']/div[.//text()='Number'] 

Видимо, первый один действительно ищет «Номер» независимо от значения первого ограничения до тех пор, как каждый определяется в моем файле (не обязательно должен находиться в своем восходящем пути XNode.)

В заключение я рекомендую использовать хром xpath helper, так как его поведение близкое к случайному, оно дает разные результаты после удаления и замены одного и того же выражения. Тьфу. Единственный другой для хром - это рекламное ПО ... Я вычислил свой результат методом проб и ошибок с помощью инструмента проверки firefox xpath.

1, мне пришлось дополнительно добавить узел вверх для элемента для инструмента углового выбора ui (мы используем selectize.js, поле выбора для поиска), иначе оно было смущено возврату, но это не связано с оригинальный вопрос, как я пытался это раньше с оригинальным выражением.

2, мне также пришлось добавить узел между первым и вторым текстовым поиском, иначе он будет искать второе выражение в первом тоже, например. ищет Number in Zero и обрабатывает его как действительное значение, если найдено. Проблема по-прежнему встречается наоборот, это также можно устранить, применяя дополнительные ограничения типа/имени в первом (не в последнем примере для экономии места).

Так это то, что я закончил с:

.//div[@name='typeList']//div/div[.//text()='Zero']/div/div/div[.//text()='Number'] 
Смежные вопросы