Селен: проверьте, полностью ли текст виден

Есть ли способ проверить с помощью Selenium, полностью ли виден текст? Допустим, у меня есть текст

lorum ipsum dolor sit amet

и из-за плохого css он читает только

lorem ips

на странице остальное находится под неправильно размещенным div. Есть ли способ утверждать, что весь текст виден?


person d135-1r43    schedule 05.02.2016    source источник
comment
Интересная проблема. Не могли бы вы привести воспроизводимый пример?   -  person alecxe    schedule 05.02.2016
comment
Когда вы говорите полностью видимый, вы также имеете в виду прокрученный, то есть фактически видимый для человека?   -  person Andrew Regan    schedule 05.02.2016
comment
Я просто предлагаю stackoverflow.com/q/16931600/954442 в качестве отправной точки для начала обсуждения.   -  person Andrew Regan    schedule 05.02.2016


Ответы (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 не будет возвращать текст, который не виден пользователю, поэтому все, что вам нужно сделать, это сравнить полученный результат с ожидаемой строкой. Если они не равны, то, скорее всего, текст скрыт.

person JeffC    schedule 05.02.2016

Вот код 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;

}    

Этот метод вернет истину ТОЛЬКО в том случае, если элемент найден, и его внутренний текст соответствует критериям равенства, то есть текст, переданный как параметр - lorum ipsum dolor sit amet

Надеюсь это поможет ;)

person Mario Galea    schedule 05.02.2016
comment
Это даже отдаленно не покрывает сути требований OP к видимости. - person Andrew Regan; 05.02.2016
comment
@AndrewRegan, можешь привести пример? - person Mario Galea; 06.02.2016
comment
Я бы передал By (локатор элемента) и желаемую строку в вашу функцию. - person JeffC; 06.02.2016
comment
@JeffC Я передаю найденный элемент и уже строку: `if (element.getText (). Equals (lorum ipsum dolor sit amet)) {` - person Mario Galea; 06.02.2016
comment
Вы их не передаете ... вы их жестко запрограммировали. - person JeffC; 06.02.2016
comment
Это просто тривиальный пример, демонстрирующий базовое использование. Я не включил утверждение, чтобы избежать путаницы. Это просто демонстрация. Пользователь может расширить мой пример. - person Mario Galea; 06.02.2016
comment
@JeffC Пользователь может изменить и расширить мой пример. Конечно, это не идеальный способ вызова метода при написании фреймворка автоматизации, но это просто понятный пример. Да, я мог бы сделать это тоже, инициализировав строку с помощью lorum ipsum dolor sit ametit и передав ее как параметр - person Mario Galea; 06.02.2016
comment
Я бы сделал это ... public boolean checkForText(By locator, String expectedString) { return driver.findElement(locator).getText().equals(expectedString); }. Намного проще и многоразовее. Он также более точно соответствует имени функции ... checkForText (). Он должен делать только одно ... не щелкать элементы и т. Д. - person JeffC; 06.02.2016
comment
@JeffC Щелчок закомментирован. Я просто обращаю внимание пользователя на некоторые дополнительные функции класса WebElement. Вы явно упускаете суть и выходите из контекста. - person Mario Galea; 06.02.2016
comment
Когда OP сказал полную видимость, я понял, что это немного больше, чем явно не скрыто, также они ссылались на плохой CSS, поэтому с учетом этой неопределенности, только OP может быть судьей. Мы увидим. Важно знать, что getText() может / не может делать, но это ясно для OP только в результате этого обсуждения. Ваш ответ не оправдывал вопрос ИМО. - person Andrew Regan; 06.02.2016

Ниже приведен один из способов сделать это, если вы используете Java.

Сначала найдите элемент с правильным локатором и выполните getText(), а затем сравните строку с ожидаемым (полным текстом).

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

Может быть примерно так:

String actual = driver.findElement(By.cssSelector("")).getText().trim();
assertEquals(actual, expected);
person AGill    schedule 05.02.2016
comment
если вы читаете вопрос OP, текст там. проблема в том, что они пытаются проверить визуальные эффекты элемента. весь соответствующий текст присутствует, просто отображается некорректно - person ddavison; 05.02.2016
comment
Что ж, OP говорит, что остальное находится под ошибочно размещенным div. Как я уже сказал, использование ПРАВИЛЬНОГО ЛОКАТОРА приведет к получению текста, который находится под правильным тегом <div>, а не того, что находится под неправильно размещенным тегом <div>. @sircapsalot Не могли бы вы прочитать его вопрос еще раз? Спасибо. - person AGill; 05.02.2016
comment
OP понимает, что определенные правила CSS могут отображать полную строку только частично видимой (для человека), что не распространяется на основные правила Selenium, поэтому, как предполагает @sircapsalot, вы все еще упускаете суть. - person Andrew Regan; 05.02.2016
comment
@AndrewRegan webdriver не будет возвращать текст, который не виден пользователю. Если реальный пользователь видит только частичный текст, webdriver вернет только этот частичный текст. - person AGill; 06.02.2016
comment
@AndrewRegan и sircapsalot, вы оба упускаете суть. Selenium не увидит текст (в общем случае), который не видит пользователь. Сравнение того, что возвращает Selenium, с ожидаемым текстом - это способ сделать это. Если не верите, запустите код из моего ответа и убедитесь сами. - person JeffC; 06.02.2016
comment
@sircapsalot см. мой комментарий выше. (Я не могу ответить более чем одному человеку в одном комментарии). - person JeffC; 06.02.2016
comment
Когда OP сказал полную видимость, я понял, что это немного больше, чем явно не скрыто, также они ссылались на плохой CSS, поэтому с учетом этой неопределенности, только OP может быть судьей. Важно знать, что getText() может / не может, но это ясно OP только в результате этого обсуждения, а не из исходного ответа. - person Andrew Regan; 06.02.2016