2016-02-29 2 views
0

У меня есть готовый код, и я пытаюсь написать для него тесты с использованием селена. Это как мой код выглядит как в элементе вкладке хрома:Невозможно выбрать текст с использованием селена

<table id="xyz"> 
    <tbody> 
     <tr>...</tr> 
     " 
      I am not able to retrieve this text. 
     " 
    </tbody> 
</table> 

Выполнение этого $x("//*[contains(text(),'I am not able to retrieve this text')]"); в консоли вкладка хрома не показывает никаких результатов. Я могу получить текст этой командой, если текст определен в div, span и т. Д. (Также чувствительность к регистру не является проблемой).

В коде, текст которого добавляется в tbody с использованием jQuery('tbody').append(abc());, и функция abc() возвращает этот текст таким образом pqr.html();

Теперь мои вопросы - это то, что выражение xpath должно написать, чтобы захватить этот текст? И я ищу чистое выражение xpath i.e нет java-функций и т. Д.

+0

Это недопустимый html, у вас не может быть текстового ввода в качестве ребенка 'tbody' – Pete

ответ

0

ожидает единственное значение как первый параметр. Элемент HTML может содержать в нем несколько дочерних узлов текстовых узлов, и в этом случае ваша попытка XPath будет оценивать только первый текстовый узел. Согласно опубликованному образцу HTML, первый текстовый узел <tbody>, который будет оцениваться, состоит из новой строки и некоторых пробелов, поэтому ваш XPath не учитывал соответствие <tbody> и не возвращал результата.

Чтобы избежать этой проблемы описан выше, использовать в предикате для отдельных текстовых узлов, как в следующем:

//*[text()[contains(.,'I am not able to retrieve this text')]] 

или таким образом, если вы хотите вернуть сам текстовый узел вместо родительского элемента:

//*/text()[contains(.,'I am not able to retrieve this text')] 
+0

Это сработало. Но я столкнулся с другой проблемой. Вначале я не упоминал в описании этих вопросов, но в DOM есть два места, где появляется этот текст. Теперь, когда я пытаюсь получить текст из желаемого места, это не позволяет мне это получить. Это команда, которую я использую «// html/table [@id, 'xyz'] // */text() [содержит (., 'Я не могу получить этот текст')]" и " // html/table [@id, 'xyz']/text() [содержит (., 'Я не могу получить этот текст')] " –

+0

Я понял это сам. "/html//table[@id='xyz']//*/text()[contains(., 'Я не могу получить этот текст')]". Спасибо за Ваш ответ. Это сэкономило много сил моих –

0

Этот элемент table, вероятно, находится внутри рамки. Чтобы получить доступ к содержимому внутри кадра, вам нужно сначала переключиться на него. Вы можете использовать метод «переключиться на» в селене. Обратитесь к этому answer и этому one.

По этой же причине он не работает в консоли Chrome Dev Tools. На вкладке консоли имеется выпадающий список, содержащий список фреймов. Убедитесь, что вы выбрали правильный кадр, в котором находится определенный элемент, а затем выполните свой XPath.

Смежные вопросы