Вы используете массив как объект, разница между getElementbyId
и getElementsByClassName
такова:
getElementbyId
вернет вам объект. getElementsByClassName
вернет вам массив. Метод
blockquote>getElementsByClassName(classNames)
принимает строку, содержащую неупорядоченный набор уникальных разделенных пробелами маркеры, представляющие классы. При вызове метод должен возвращать живой объектNodeList
, содержащий все элементы документа, которые имеют все классы, указанные в этом аргументе, получив классы, разделив строку на пробелы. Если в аргументе нет токенов, тогда метод должен возвращать пустой NodeList.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
.
Вы не можете сделать это с помощью селектора CSS, потому что селектор CSS не имеет достаточно тонкого подхода, чтобы выразить «текстовый узел, содержащийся в DIV, но не его другое содержимое». Вы можете сделать это с помощью локатора XPath:
driver.findElement(By.xpath("//div[@id='recipient_div_3']/text()")).getText()
В выражении XPath будет идентифицироваться только один текстовый узел, который является прямым потомком DIV, а не весь текст, содержащийся в нем, и его дочерние узлы.
Я не уверен, что это возможно с помощью одного 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()
Вы также можете получить текстовое содержимое элемента и удалить теги с помощью регулярного выражения. Также обратите внимание: вы должны использовать неохотный quntifier https://docs.oracle.com/javase/tutorial/essential/regex/quant.html
String getTextContentWithoutTags(WebElement element) {
return element.getText().replaceAll("<[^>]*?/>", "").trim();
}
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