【问题标题】:How to identify the text within the <a> using Selenium and Java如何使用 Selenium 和 Java 识别 <a> 中的文本
【发布时间】:2022-02-16 06:04:43
【问题描述】:

这是我要测试的demo store的代码:

 <li class="level0 nav-2 parent">
      <a href="http://demo-store.seleniumacademy.com/men.html" 
               class="level0 has-children">Men</a> 
        <ul class="level0">
            <li class="level1 view-all">
               <a class="level1" href="http://demo- 
                         store.seleniumacademy.com/men.html">View All 
                         Men</a>
            </li>
               <li class="level1 nav-2-1 first"><a></a></li>
               <li class="level1 nav-2-2"><a href="http://demo- 
                          store.seleniumacademy.com/men/shirts.html" 
                          class="level1">text to get</a> 
               </li>
               <li class="level1 nav-2-3"><a></a></li>
         </ul>
    </li>

我想获取这些子类别的文本,以便稍后通过使用链接元素内的文本单击特定类别。我的代码是:

public Subcategory openSubcategory (String subcategoryName){

    List<WebElement> subcategories = driver.findElements(By.cssSelector("a.level1"));

    for (WebElement element: subcategories) {
        if (element.getText().equals(subcategoryName)){
            element.click();
            break;
        }
    }
    return new Subcategory(driver);
}

但它不会进入循环,可能是因为element.getText() 是空的。

【问题讨论】:

  • 也许你错过了一些延迟/在这里等待?
  • 我尝试添加等待,但隐式等待被划掉。也许我在错误的地方等待。应该在哪里?
  • @StefanItic 我的意思是延迟,而不是隐式等待。将它放在收集元素的行之前。 IE。之前List&lt;WebElement&gt; subcategories = driver.findElements(By.cssSelector("a.level1"));
  • @Prophet 抱歉,我是这里的新手,所以我不知道如何添加延迟。我只知道隐式和显式等待......你能给我我应该在里面实现的代码吗?

标签: java selenium selenium-webdriver webdriverwait mousehover


【解决方案1】:

要点击WebElement,文本为衬衫,首先你必须Mouse Hover元素,文本为MenWebDriverWait 诱导为visibilityOfElementLocated,您可以使用以下locator strategies

public Subcategory openSubcategory (String subcategoryName){

    WebElement menuMen = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(@class,'has-children') and text()='Men']")));
    new Actions(driver).moveToElement(menuMen).build().perform();
    List<WebElement> subcategories = driver.findElements(By.xpath("//a[contains(@class,'has-children') and text()='Men']//following::ul[1]//li/a"));
    for (WebElement element: subcategories) {
        if (element.getText().equals(subcategoryName)){
            element.click();
            break;
        }
    }
    return new Subcategory(driver);
}

【讨论】:

  • 天哪,终于成功了!!!!非常感谢你!!你能解释一下你是如何使用xpath的吗?我以一种非常简单的方式使用它,但我不明白您在 xpath 中键入的所有内容。
  • @StefanItic 带有文本 Men 的元素具有 class level0 has-children 其中因为我只考虑 has-children 因为我怀疑 level0 是动态的。在具有后代li -&gt; a的下一个元素中进一步需要&lt;ul&gt;元素
【解决方案2】:

element.getText() 可以为空。

试试:

element.getAttribute("value");
// or
element.getAttribute("innerHTML");

将您的 CSS 更改为:

"a[class*='level']";
// or
"a[]";

调试代码并检查元素是否为空

【讨论】:

  • 我都试过了,都不行
  • element.getAttribute("href")?
  • 它可能会得到href,但我想要文本,所以我可以调用方法并比较链接中的文本和我输入的文本。我尝试了顺便说一句,它没有点击我想要的链接。
  • 尝试只获取带有标签 A 的元素。调试代码并告诉我 element.getAttribute("href") 里面写了什么
  • 不知道里面写的是什么...
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 2013-07-22
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2020-01-25
相关资源
最近更新 更多