Как написать css-селектор для текста, который не находится внутри какого-либо элемента dom [duplicate]

Вы используете массив как объект, разница между getElementbyId и getElementsByClassName такова:

  • getElementbyId вернет вам объект.
  • getElementsByClassName вернет вам массив.

getElementsByClassName

Метод getElementsByClassName(classNames) принимает строку, содержащую неупорядоченный набор уникальных разделенных пробелами маркеры, представляющие классы. При вызове метод должен возвращать живой объект NodeList, содержащий все элементы документа, которые имеют все классы, указанные в этом аргументе, получив классы, разделив строку на пробелы. Если в аргументе нет токенов, тогда метод должен возвращать пустой NodeList.

blockquote>

https://www.w3.org/TR/2008/WD-html5 -20080610 / dom.html # getelementsbyclassname

getElementById

Метод getElementById () обращается к первому элементу с указанным id.

blockquote>

http://www.w3schools.com/jsref/met_doc_getelementbyid.asp

в вашем коде строки:

1- document.getElementsByClassName ('myElement'). Style.size = '100px';

blockquote>

НЕ будет работать, как ожидалось, потому что getElementByClassName вернет массив, и массив будет НЕ имеет свойство style, вы будете обращаться к каждому element, итерации их.

Вот почему функция getElementById работает на вас, эта функция вернет вам прямой объект, и поэтому вы сможет получить доступ к свойству style.

8
задан Adam Pengal 27 April 2012 в 16:55
поделиться

3 ответа

Вы не можете сделать это с помощью селектора CSS, потому что селектор CSS не имеет достаточно тонкого подхода, чтобы выразить «текстовый узел, содержащийся в DIV, но не его другое содержимое». Вы можете сделать это с помощью локатора XPath:

driver.findElement(By.xpath("//div[@id='recipient_div_3']/text()")).getText()

В выражении XPath будет идентифицироваться только один текстовый узел, который является прямым потомком DIV, а не весь текст, содержащийся в нем, и его дочерние узлы.

4
ответ дан Ross Patterson 22 August 2018 в 07:07
поделиться
  • 1
    Локатор XPath предоставлен логично и работает в консоли Chrome, но он не будет работать в Selenium. Selenium выдает следующую ошибку ... The given selector //div[@class='StdLevel1']/text() is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: The result of the xpath expression "//div[@class='StdLevel1']/text()" is: [object Text]. It should be an element. – BSchlinker 30 March 2013 в 10:52
  • 2
    Итак, есть ли решение или вы просто возьмете div и проанализируете строку getText ()? – Brantley Blanchard 2 October 2013 в 17:41
  • 3
    Насколько я понимаю, Infact selenium позволяет разрешать функцию text (), node и т. Д. – SIslam 5 October 2015 в 19:44

Я не уверен, что это возможно с помощью одного css-локатора, но вы можете получить текст из div, а затем получить текст из дочерних узлов div и вычесть их. Что-то вроде этого (код не был проверен):

String temp = "";
List<WebElement> tempElements = driver.findElements(By.cssSelector("div[id='recipient_div_3'] *"));
for (WebElement tempElement : tempElements) {
    temp =+ " " + tempElement.getText();
}
String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " ").replace(temp, "");

Это относится к случаю, когда вы пытаетесь избежать использования xpath. Xpath позволяет это сделать:

//div[@id='recipient_div_3']/text()
4
ответ дан Aleh Douhi 22 August 2018 в 07:07
поделиться

Вы также можете получить текстовое содержимое элемента и удалить теги с помощью регулярного выражения. Также обратите внимание: вы должны использовать неохотный quntifier https://docs.oracle.com/javase/tutorial/essential/regex/quant.html

String getTextContentWithoutTags(WebElement element) {
    return element.getText().replaceAll("<[^>]*?/>", "").trim();
}
0
ответ дан dbow 22 August 2018 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: