【问题标题】:How to perform Xpath looping and skip one element如何执行 Xpath 循环并跳过一个元素
【发布时间】:2018-06-18 07:19:06
【问题描述】:

如何执行 X 路径循环?

for  (int i=1;i<3;i++)
    String xPath = "//*[@id='rso']//h3/a["+i+"]"
    all_elements_text.add(driver.findElement(By.xpath(xPath)).getText());                  
return all_elements_text.toArray() ; } 

我想跳过a[2]

【问题讨论】:

  • if (i != 2) { 随心所欲 }
  • 但是您一般想要实现什么?也许还有其他/更好的解决方案
  • 实际上我想跳过 By.xpath("//*[@id='rso']//h3/a["2"] 因为这给了我无法定位的错误。
  • 我可以在哪里使用?你能写完整的代码吗
  • Ankur 做到了...我会指给你his answer ^^

标签: java xml selenium for-loop xpath


【解决方案1】:

试试下面的代码

for  (int i=1;i<3;i++){
    if(i!=2){
        all_elements_text.add(driver.find Element(By.xpath("//*[@id='rso']//h3/a["+i+"]")).getText());  

    return all_elements_text.toArray() ; 
    }

【讨论】:

  • 答案不应该以“try”开头,try 表示你必须猜测问题可能出在哪里。这意味着要么 OP 对他的问题没有具体说明,要么你没有很好地理解它。答案应该是解决方案而不是可能性
  • @Mischa 并非总是如此。您可以理解问题并找到解决方案,但是由于您无权访问该页面/站点,因此无法对其进行测试以确保您声明...尝试。
【解决方案2】:

使用下面的代码来实现您所需要的相同

public static ArrayList<String> getAllValues()
{
    ArrayList<String> all_elements_text = new ArrayList<>();
    for(int i=1;i<3;i++)
    {
        if(i!=2)
        {
            all_elements_text.add(driver.findElement(By.xpath("//*[@id='rso']//h3/a["+i+"]")).getText()); 
        }
    }
    return all_elements_text;
}

并从需要获取所有文本并打印所有值的测试中调用此方法,例如

@Test
public void yourTestCase()
{   
     for(String s :getAllValues())
     {
         System.out.println(s);
     }

}

【讨论】:

    【解决方案3】:

    关于解决方案的几个事实:

    • 您的xpath 被编入索引变得脆弱
    • 您永远无法确定Google Analytics 何时更改搜索结果的索引。
    • 因此,最佳做法是避免并从搜索结果中删除关键字,例如Documentation

    记住这些,假设我们会:

    • 打开URL https://www.google.com/
    • 搜索文字selenium webdriver
    • 我们希望从整个搜索结果中删除包含单词 Documentation 的结果
    • 这是搜索文本 selenium webdriver 并删除包含单词 Documentation 的结果的示例代码:

      List <WebElement> my_list = driver.findElements(By.xpath("//div[@id='rso']//div[@class='srg']/div[@class='g']//h3/a"));
      List <String> my_text = new ArrayList<String>();
      for (int i=0; i<my_list.size(); i++)
          if(!my_list.get(i).getAttribute("innerHTML").contains("Documentation"))
              my_text.add(my_list.get(i).getAttribute("innerHTML"));  
      

    【讨论】:

    • 添加索引不会使 XPath 变得脆弱,就像通过使用 .findElement() 等假设列表中的第一个元素始终是正确的元素一样。此外,当您继续使用 innerHTML 时应该使用.getText()。它们不可互换。如果您要过滤掉一些文本,在定位器中这样做会更有效,这样您就不必循环结果,例如//div[@id='rso']//div[@class='srg']/div[@class='g']//h3/a[not(contains(.,"Documentation"))]
    • @JeffC 我真诚的建议请仔细阅读 innerHTML 的文档,如果您有任何疑问,请告诉我。您需要了解 getAttribute()getText() 之间的区别。 算法实现 否则您将继续否决与StackOverflow Community 相反的好的答案。其次,您需要了解如何优化xpath 以获得更好的性能。第三,可以有多种方法来解决问题,而我的方法解决了查询。您必须验证自己并收回您的反对票,以获得更好的氛围。
    • 让我在这里放一个指向innerHTML documentation 的链接,以便您自己阅读。因为如果您自己仔细阅读它,您就会明白它是如何工作的。 innerHTML 返回 the serialized HTML code describing all of the element's descendants. 所以它返回 HTML,而不仅仅是文本。
    • .getText() only 返回文本。 Here's a link 也可以参考 Java 文档,以便您阅读并了解其中的区别。它返回 the visible (i.e. not hidden by CSS) innerText of this element, including sub-elements, without any leading or trailing whitespace. 所以它只返回包含的文本,而不是 HTML。
    • 我没有提到 XPath 的性能,你说 XPath 会因索引而变得脆弱,但事实并非如此,我解释了为什么它不会,但你从来没有解释为什么会这样做。
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2017-11-11
    • 1970-01-01
    • 2017-07-11
    • 2012-03-02
    • 2022-01-21
    • 2012-03-12
    • 2019-01-01
    相关资源
    最近更新 更多