Как получить сумму цены без страйка в селене, используя xpath? - PullRequest
0 голосов
/ 29 марта 2019

Это URL веб-страницы, которую я пытаюсь автоматизировать:

http://www.qaclickacademy.com/courses-description.php

Я хочу получить значение цены без зачеркивания (в настоящее время $ 20,00), используя Selenium и локатор XPath.

Фрагмент разметки 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=130&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=130&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=130&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>

Я пробовал много способов, но до сих пор не смог найти решение

Ответы [ 4 ]

1 голос
/ 29 марта 2019

Вот метод в 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)
0 голосов
/ 29 марта 2019

Цена без зачеркивания, т. Е. Текст $ 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
    
0 голосов
/ 29 марта 2019

Трудно знать, как ответить на ваш вопрос без более подробной информации, на странице есть несколько элементов, которые имеют количество зачеркнутых / не просчитанных сумм.

Для общего решения вы можете использовать следующее: оно будет соответствовать нескольким блокам, которые имеют цены. Если вы хотите что-то более целенаправленное, вам понадобится немного более сложный локатор, который определяет товар, а также ценовой блок. Если вы просто хотите первый ценовой блок на странице, это будет работать, хотя:

//*[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");

Элемент StringHTML будет содержать следующее:

<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00

Затем вам нужно будет проанализировать строку, чтобы убрать первые две строки (хотя это не очень хорошее и надежное решение).

0 голосов
/ 29 марта 2019
xpath=//section[@id='content']/div/div/div/div/div/div[2]/div/div[2]
...