#html #google-chrome #xpath #phantomjs #casperjs
#HTML #google-chrome #xpath — путь #phantomjs #casperjs #xpath
Вопрос:
Элемент похож на:
<input type="text" class="information">
Для элемента нет идентификатора. Внутри text
класса есть только один information
элемент type. Я хочу иметь возможность вводить текст в этот html-элемент, используя casperjs
который работает поверх phantomjs
.
XPath, полученный с помощью chrome developer tools, похож на:
//*[@id="abcid"]/div/div[1]/input
abcdid — это идентификатор элемента div, который состоит из текстового поля и нескольких других элементов. Но мне нужен более надежный XPath. Я не очень опытен в поиске XPaths, поэтому простите меня, если ответ слишком очевиден.
Комментарии:
1. Вы действительно использовали утилиту XPath casperjs?
var x = require('casper').selectXPath; x('//*[@id="abcid"]/div/div[1]/input')
. Почему бы просто не использовать CSS-селектор:input.information[type='text']
2. @ArtjomB. Ошибка «элемент не найден» была вызвана тем, что не была импортирована утилита xpath casperjs. Я понял это достаточно скоро, но не обновил вопрос, потому что мне нужен был более надежный XPath, чтобы небольшие изменения в html не потребовали от меня повторного изменения xpath. Я думаю, CSS-селектор был бы хорош. Я сейчас их читаю. Думаю, все пойдет именно так, особенно если они имеют аналогичную структуру, как в вашем комментарии. Спасибо!
Ответ №1:
Если вы хотите использовать селекторы XPath почти для всех функций CasperJS, вам нужно предоставить его как объект. Если селектор предоставлен в виде строки, автоматически предполагается, что это селектор CSS.
Вы можете создать объект выбора XPath самостоятельно:
{
type: 'xpath',
path: '//input[@class="information"]'
}
или просто воспользуйтесь утилитой XPath, сначала запросив ее в начале вашего скрипта, а затем используя ее:
var x = require('casper').selectXPath;
// later ...
var text = casper.fetchText(x('//input[@class="information"]'));
Что касается вашего селектора:
Если существует только один, input
с information
классом, вы можете использовать XPath
//input[@class="information"]
или селектор CSS
input.information[type='text']
Если во входных данных есть и другие классы, селектор CSS будет работать как есть, но селектор XPath должен быть изменен на
//input[contains(@class,"information")]
Комментарии:
1. Спасибо. У меня есть один последующий вопрос: если я хочу указать более одного класса и другие вещи, такие как text (). Могу ли я добавить их все в квадратные скобки? Например:
//p[contains(@class,"class1"),contains(@class,"class2"),contains(text(),"abc")]
.2. Да, но с немного другим синтаксисом:
//p[contains(@class,"class1") and contains(@class,"class2") and contains(text(),"abc")]
. Имейте в виду, чтоtext()
возвращает только текстовые узлы текущего элемента (в данном случае текст непосредственно внутриp
). Если вам нужен любой текст, независимо от глубины, вы можете сделать//p[contains(.,"abc")]