#javascript #selenium #xpath #webdriverwait #xpath-1.0
#javascript #selenium #xpath #webdriverwait #xpath-1.0
Вопрос:
Это URL веб-страницы, которую я пытаюсь автоматизировать:
http://www.qaclickacademy.com/courses-description.php
Я хочу получить значение цены без зачеркивания (в настоящее время $ 20,00), используя Selenium и XPath locator.
Фрагмент HTML-разметки, который включает интересующий меня элемент, является:
<div class="course row" data-scroll-reveal=""
style="-webkit-transform: translatey(24px);transform: translatey(24px);opacity: 0;-webkit-transition: -webkit-transform 0.66s ease-in-out 0s, opacity 0.66s ease-in-out 0s;transition: transform 0.66s ease-in-out 0s, opacity 0.66s ease-in-out 0s;-webkit-perspective: 1000;-webkit-backface-visibility: hidden;"
data-scroll-reveal-initialized="true">
<div class="col-sm-4">
<a href="course-detail.php?id=130amp;amp;t=websecurity-testing-for-beginners-qa-knowledge-to-next-level">
<img src="/courses-description.php?show=130" alt="websecurity-testing-for-beginners-qa-knowledge-to-next-level" class="img-responsive" width="186" height="123">
</a>
</div>
<div class="col-sm-8">
<div class="row">
<div class="col-md-9 col-sm-8">
<h3>
<a href="course-detail.php?id=130amp;amp;t=websecurity-testing-for-beginners-qa-knowledge-to-next-level">
WebSecurity Testing for Beginners-QA knowledge to next level
</a>
</h3>
<div class="meta">
<span><i class="fa fa-user"></i><a href="#">Rahul Shetty</a></span>
<span><i class="fa fa-file-text"></i>60 Lessons</span>
<span><i class="fa fa-folder"></i><a href="#">Penetration testing</a></span>
</div>
</div>
<div class="col-md-3 col-sm-4 price">
<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00
</div>
</div>
<div class="row">
<div class="col-sm-12">
<p class="course-desc">
Course Launch Date : Aug 30th 2015 -Its Time to Protect our Websites from Security Attacks This Tutorial will give all the weapons you needed to investigate and
unlock the Security Holes in the Web applicationCourse lectures are conceptually driven with root level explanations and bring you to the level where you can
bring out the security bugsCourse Contents: Basics of Security Testing...
<br>
<a href="course-detail.php?id=130amp;amp;t=websecurity-testing-for-beginners-qa-knowledge-to-next-level">
Read More
<i class="fa fa-angle-right"></i>
</a>
</p>
</div>
</div>
</div>
<div class="col-md-12">
<hr>
</div>
</div>
Я перепробовал много способов, но пока мне не удалось найти решение
Комментарии:
1. Попробуйте это, это сработает //del[содержит (text(), ‘$ 85.00’)]
2. Вывод должен быть «$ 20,00». Цена является динамической. Это будет часто меняться…
3. какой из них, есть 4
4. первая цена продукта «$ 20,00»
5. Привязку к какому языку вы используете? Java / Python?
Ответ №1:
Вот метод в python, который получит только цену ($ 20,00). Примечание: Это не сработает в обоих случаях, когда у вас есть фиксированная цена или нет.
def get_text_exclude_children(element):
return driver.execute_script(
"""
var parent = arguments[0];
var child = parent.firstChild;
var textValue = "";
while(child) {
if (child.nodeType === Node.TEXT_NODE)
textValue = child.textContent;
child = child.nextSibling;
}
return textValue;""",
element).strip()
Как использовать здесь.
element = driver.find_element_by_xpath("(//div[@class='col-md-3 col-sm-4 price'])[1]")
price = get_text_exclude_children(element)
Ответ №2:
Цена без зачеркивания, то есть текст в 20,00 долларов, является текстовым узлом, и для извлечения текста вы можете использовать следующее решение:
-
Решение на Java:
WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='course row']//div[contains(@class, 'price')]"))); String myText = ((JavascriptExecutor)driver).executeScript("return arguments[0].lastChild.textContent;", element).toString(); System.out.println(myText);
-
Вывод на консоль:
$ 20.00
Ответ №3:
xpath=//section[@id='content']/div/div/div/div/div/div[2]/div/div[2]
Комментарии:
1. Оба значения отражают 85,00 долларов США и 20,00 долларов США. Нужно получить значение без страйка
2. Можете ли вы попробовать добавить еще один [2] в конце?
3. Не собираюсь ничего делать, OP пытается найти текстовый узел, а не элемент
Ответ №4:
Трудно понять, как ответить на ваш вопрос без более подробной информации, на странице есть несколько элементов, которые имеют сквозную / не сквозную сумму.
Для общего решения вы могли бы использовать следующее, оно будет соответствовать нескольким блокам, у которых есть цены. Если вы хотите что-то более целенаправленное, вам понадобится немного более сложный локатор, который определяет товар, а также ценовой блок. Хотя, если вам нужен только первый ценовой блок на странице, это сработает:
//*[contains(@class,'price')]
Это то же самое, что и следующий CSS-селектор (который намного менее сложный)
.price
Однако увеличение наценки вызовет у вас проблему, это выглядит следующим образом:
<div class="col-md-3 col-sm-4 price">
<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00
</div>
В строгом XPath вы могли бы сделать это, используя XPath, подобный:
//*[contains(@class,'price')]/text()
Однако Selenium не позволяет вам привязывать текстовый узел к WebElement. Это означает, что, хотя приведенный выше Xpath будет работать непосредственно в браузере, он не будет работать в качестве локатора для поиска WebElement (поскольку он не находит элемент, он находит текстовый узел).
Лучший способ исправить это — вызвать ошибку и заставить разработчика поместить сумму, которая не вычеркнута, в свой собственный элемент (например, обернуть ее <span>
).
В качестве простого обхода вы могли бы попробовать получить внутренний HTML элемента следующим образом:
WebElement price = driver.findElement(By.cssSelector(".price"));
String elementHTML = price.getAttribute("innerHTML");
Тогда строка elementHTML будет содержать следующее:
<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00
Затем вам нужно будет проанализировать строку, чтобы удалить первые две строки (хотя это не очень хорошее или надежное решение).