如何使用xpath获取硒的非行使价?

时间:2019-03-29 11:33:41

标签: javascript selenium xpath webdriverwait xpath-1.0

这是我要自动执行的网页的网址:

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

我想使用Selenium和XPath定位器获得非删除线价格(当前为$ 20.00)的值。

包含我感兴趣的元素的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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

xpath=//section[@id='content']/div/div/div/div/div/div[2]/div/div[2]

答案 2 :(得分:0)

很难不知道更多细节就如何回答问题,页面上有多个项目具有删除线/未删除线量。

对于通用解决方案,您可以使用以下内容,它将匹配多个具有价格的块。如果您想要更具针对性的商品,则需要一个稍微复杂一点的定位器来指定商品和价格块。如果您只希望页面上的第一个价格块,则可以使用:

NAMESPACE

这与以下CSS选择器相同(其复杂程度要低得多)

exportPattern("^[^_]+")

但是加价会给您带来麻烦,它看起来像这样:

$(function() {
  var list1 = $.get('list1.txt');
  var list2 = $.get('list2.txt');
  var list3 = $.get('list3.txt');
  
  $.when(list1, list2, list3).done(function(results1, results2, results3){
    $('#dropdown').empty()
      .append(results1)
      .append(results2)
      .append(results3);
  });
});

在严格的XPath中,您可以使用如下XPath来实现:

//*[contains(@class,'price')]

但是,Selenium不允许您将文本节点绑定到WebElement中。这意味着,尽管上述Xpath可直接在浏览器中使用,但不能用作查找WebElement的定位器(因为它找不到元素,而是找到了文本节点)。

解决此问题的最佳方法是引发一个错误,并让开发人员将未删除的金额放入其自己的元素中(例如,用.price 包装)。

作为一种变通方法,您可以尝试获取元素的内部HTML,如下所示:

<div class="col-md-3 col-sm-4 price">
    <del style="font-size:15px;color:#aaa">$ 85.00</del>
    <br>
    $ 20.00
</div>

然后,String元素HTML将包含以下内容:

//*[contains(@class,'price')]/text()

然后您将需要解析String以去除前两行(尽管这不是一个不错的解决方案,也不是可靠的解决方案)。

答案 3 :(得分:0)

非删除线价格,即文本 $ 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