提问者:小点点

selenium/工具提示/动态生成/验证工具提示文本


我在验证工具提示的文本时遇到问题,当您将鼠标悬停在按钮上时,其 html 代码是动态生成的。以下是我正在尝试处理的页面的链接:

http://www . globals QA . com/demoSite/practice/tooltip/video-player . html

我已经尝试了很多东西并搜索了许多论坛,但没有任何帮助我获取工具提示的文本,这是第一件事。另一个是,有一个 with 角色作为日志,当您将鼠标悬停在按钮上时,它会不断添加工具提示的文本值。当第一件事失败时,我就在那部分工作了。这是我的代码,它只是让我获得上次悬停按钮的文本值,其余为空字段!

    Actions builder = new Actions(driver);
    WebElement a1 = driver.findElement(By.xpath("/html/body/div/span/button[@title='I like this']"));
    WebElement a2 = driver.findElement(By.xpath("/html/body/div/span/button[@title='I dislike this']"));
    WebElement a3 = driver.findElement(By.xpath("/html/body/div/div/button[@title='Add to Watch Later']"));
    WebElement a4 = driver.findElement(By.xpath("/html/body/div/div/button[@title='Add to favorites or playlist']"));
    WebElement a5 = driver.findElement(By.xpath("/html/body/div/button[@title='Share this video']"));
    WebElement a6 = driver.findElement(By.xpath("/html/body/div/button[@title='Flag as inappropriate']"));

    builder.moveToElement(a1).moveToElement(a2)
    .moveToElement(a3).moveToElement(a4)
    .moveToElement(a5).moveToElement(a6)
    .perform();

    Thread.sleep(2000);
    List<WebElement> element = driver.findElements(By.xpath("/html/body/div[@role='log']/div"));
    System.out.println(element.size());
    for(WebElement ele : element)
        System.out.println(ele.getText());

如果有人认为为每个按钮单独调用 moveToElement 并在移动之间使用 Thread.sleep() 可以工作,我已经尝试过但没有工作!具体来说,当您将鼠标逐个悬停在它们上时,我希望所有 6 个按钮的工具提示文本值。硒版本(3.0.1), 浏览器(Chrome:版本 55.0.2883.87 m)

添加:这就是div标签构建的方式,附加html代码:

<div role="log" aria-live="assertive" aria-relevant="additions" class="ui-helper-hidden-accessible"><div style="display: none;">I like this</div><div style="display: none;">I dislike this</div><div style="display: none;">Add to Watch Later</div><div style="display: none;">Add to favorites or playlist</div><div style="display: none;">Share this video</div><div>Flag as inappropriate</div></div>
<div style="display: none;">I like this</div>
<div style="display: none;">I dislike this</div>
<div style="display: none;">Add to Watch Later</div>
<div style="display: none;">Share this video</div>
<div style="display: none;">Add to Watch Later</div>
<div>Flag as inappropriate</div>

共3个答案

匿名用户

< code>getText()只获取元素的可见文本,所以除非在获取文本时所有的工具提示仍然可见,否则只有最后一个工具提示会给出文本——这就是你所看到的。

你可以做的是在每个元素上执行javascript并获取textContent属性。要么这样,要么在每次移动后获取文本,而弹出窗口仍然可见

匿名用户

谢谢卢卡斯。我之前避免了迭代元素的事情,但它适用于以下代码。你可以看到我仍然没有使用工具提示元素,而是使用了带有角色作为日志的div标签来记录我的值。我也会尝试javascript并给出答案。如果有人需要参考,这是我前两个按钮的代码:

builder.moveToElement(a1).perform();
    List<WebElement> element = driver.findElements(By.xpath("/html/body/div[@role='log']/div"));
        System.out.println(element.get(element.size()-1).getText());

    builder.moveToElement(a2).perform();
    element = driver.findElements(By.xpath("/html/body/div[@role='log']/div"));
        System.out.println(element.get(element.size()-1).getText());

匿名用户

我在Chrome控制台中检查页面的HTML,由于我没有写代码,我想确保工具提示出现(正如我问你的)。tooltip元素的定位器可能是下面的XPath(您可以在Chrome的控制台中使用类似< code > $ x("//your/XPath/here ")的内容来检查它):

"//div[@role='tooltip']"

请注意,由于此元素是动态添加的,因此选择器仅在工具提示可见时才起作用;一旦移动指针,并且工具提示消失,该元素也会从页面中删除,并且该定位器不起作用。

所以你的代码应该是这样的:

builder.moveToElement(a1).perform();
String tooltipText = driver.findElement(By.xpath("//div[@role='tooltip']")).getText();

在这种情况下,最好使用< code>By而不是< code>WebElement,因为元素是动态创建和销毁的。

如果有效,请告诉我,希望能有所帮助。