【问题标题】:Selenium: Test if text is fully visibleSelenium:测试文本是否完全可见
【发布时间】:2016-05-15 17:51:35
【问题描述】:

是否可以通过 Selenium 检查文本是否完全可见?假设我有文字

lorum ipsum dolor sat amet

而且由于 css 不好,它只能读取

lorem ips

在页面上,其余部分位于错误放置的 div 下。有没有办法断言全文可见?

【问题讨论】:

  • 有趣的问题。你能提供一个可重现的例子吗?
  • 当您说“完全可见”时,您是否还指“滚动到视图中”,即实际上对人类可见?
  • 我将建议stackoverflow.com/q/16931600/954442 作为开始讨论的起点。

标签: html css selenium selenium-webdriver ui-testing


【解决方案1】:

如果您使用 Java,以下是执行此操作的一种方法。

首先,使用正确的定位器定位元素并执行getText(),然后将字符串与预期的(全文)进行比较。

driver.findElement(By.cssSelector("")).getText().equals("");

可能是这样的:

String actual = driver.findElement(By.cssSelector("")).getText().trim();
assertEquals(actual, expected);

【讨论】:

  • 如果您阅读 OP 的问题,文本就在那里。问题是 - 他们正在尝试验证元素的视觉效果。所有适当的文字都在那里,只是没有正确显示
  • 好吧,OP 说“其余部分位于错误放置的 div 下”。正如我所说,使用正确的定位器将获得正确的<div> 标签下的文本,而不是错误放置的<div> 标签下的文本。 @sircapsalot 你介意再读一遍他的问题吗?谢谢。
  • OP 了解某些 CSS 规则可能会使完整的字符串仅部分可见(对人类),这是基本 Selenium 规则无法涵盖的内容,因此正如 @sircapsalot 所建议的那样,您仍然缺少点。
  • @AndrewRegan webdriver 不会返回用户看不到的文本。如果真实用户只看到部分文本,webdriver 将只返回部分文本。
  • @AndrewRegan 和 sircapsalot 你们都没有抓住重点。 Selenium 不会看到用户看不到的文本(在一般情况下)。将 Selenium 返回的内容与预期文本进行比较是执行此操作的方法。如果您不相信,请运行我的答案中的代码并亲自查看。
【解决方案2】:

这是检查元素内的文本是否可见的 JAVA 代码:

public boolean checkForText() {

    boolean isVisible = false;

    try {
        // Start by searching the element first.  You can search by many ways.  eg. css, id, className etc..
        WebElement element = webDriver.findElement(By.id("the elemnts' id"));
        System.out.println("Element found");
        // Check if the found element has the text you want.
        if(element.getText().equals("lorum ipsum dolor sit amet")) {
            System.out.println("Text inside element looks good");
            isVisible = true;
            //additionally, you can perform an action on the element
            //e.g. element.click();
        } else {
            System.out.println("Text does not match");
        }
    } catch (NoSuchElementException e) {
        // the method findElement throws an exception.
        System.out.println("Element not found");
    }

    return isVisible;

}    

此方法仅在找到元素且其内部文本符合等于条件时返回 true,即作为参数传递的文本 - lorum ipsum dolor sit amet

希望这会有所帮助;)

【讨论】:

  • 这甚至远远没有涵盖 OP 对“可见性”的要求的本质。
  • @AndrewRegan 你能举个例子吗?
  • 我会将 By(元素定位器)和所需的字符串传递给您的函数。
  • @JeffC 我正在传递已定位的元素和字符串:` if(element.getText().equals("lorum ipsum dolor sit amet")) { `
  • 你没有通过它们......你已经硬编码了它们。
【解决方案3】:

这是一个使用我创建的 jsFiddle 和 Java/Selenium 的简单示例。

HTML

<p id="1">lorum ipsum dolor sit amet</p>
<p id="2">lorum ipsum <div style="display:none">dolor sit amet</div></p>

代码

String expectedString = "lorum ipsum dolor sit amet";
WebDriver driver = new FirefoxDriver();
driver.get("https://jsfiddle.net/JeffC/t7scm8tg/1/");
driver.switchTo().frame("result");
String actual1 = driver.findElement(By.id("1")).getText().trim();
String actual2 = driver.findElement(By.id("2")).getText().trim();
System.out.println("actual1: " + actual1);
System.out.println("actual2: " + actual2);
System.out.println("PASS: " + expectedString.equals(actual1));
System.out.println("PASS: " + expectedString.equals(actual2));

输出

actual1: lorum ipsum dolor sit amet
actual2: lorum ipsum
PASS: true
PASS: false

Selenium 不会返回对用户不可见的文本,因此您需要做的就是将返回的内容与预期的字符串进行比较。如果它们不相等,则文本可能被隐藏。

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多