blob: 711d1bacce1751d8f1aedf71a9f6235d29625504 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copryight 2012 Software Freedom Conservancy
Copyright 2010-2012 WebDriver committers
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<title>text_test.html</title>
<meta charset="utf-8">
<link rel="stylesheet" href="/filez/_main/third_party/js/qunit/qunit.css">
<script src="/filez/_main/third_party/js/qunit/qunit.js"></script>
<script src="/filez/_main/third_party/js/qunit/qunit_test_runner.js"></script>
<script src="test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot.dom');
goog.require('bot.locators');
goog.require('goog.userAgent');
</script>
<script type="text/javascript">
QUnit.test('getVisibleText should return one line text', function(assert) {
var text = getVisibleTextByElementId('oneline');
assert.strictEqual(text, "A single line of text");
});
QUnit.test('getVisibleText should return multiline text', function(assert) {
var text = getVisibleTextByElementId('multiline');
assertContains(assert, "A div containing", text);
assertContains(assert, "More than one line of text", text);
assertContains(assert, "and block level elements", text);
});
QUnit.test('getVisibleText should ignore script elements', function(assert) {
var text = getVisibleTextByElementId('script');
assert.strictEqual(text, "Some text that contains script tags");
});
QUnit.test('getVisibleText should ignore title elements', function(assert) {
var titleElement = bot.locators.findElement({tagName: 'title'});
var text = bot.dom.getVisibleText(titleElement);
assert.strictEqual(text, '');
});
QUnit.test('getVisibleText should recursively ignore title elements', function(assert) {
var headElement = bot.locators.findElement({tagName: 'head'});
var text = bot.dom.getVisibleText(headElement);
assert.strictEqual(text, '');
});
QUnit.test('getVisibleText should represent a block level element as a newline', function(assert) {
var text = getVisibleTextByElementId('multiline');
assertStartsWith(assert, "A div containing\n", text);
assertContains(assert, "More than one line of text\n", text);
assertEndsWith(assert, "and block level elements", text);
});
QUnit.test('getVisible should collapse multiple whitespaces into a single space', function(assert) {
var text = getVisibleTextByElementId('lotsofspaces');
assert.strictEqual(text, "This line has lots of spaces.");
});
QUnit.test('getVisibleText should convert non-breaking space in a space char', function(assert) {
var text = getVisibleTextByElementId('nbsp');
assert.strictEqual(text, "This line has a non-breaking space");
});
QUnit.test('getVisibleText should not collapse non-breaking spaces', function(assert) {
var text = getVisibleTextByElementId("nbspandspaces");
assert.strictEqual(text, "This line has a non-breaking space and spaces");
});
QUnit.test('getVisibleText should not trim trailing non-breaking spaces', function(assert) {
var text = getVisibleTextByElementId("trailingnbsp");
assert.strictEqual(text, "This line has trailing non-breaking spaces ");
});
QUnit.test('getVisibleText should not trim non-breaking spaces at the end of a line in the middle of text', function(assert) {
var text = getVisibleTextByElementId("multilinetrailingnbsp");
assertStartsWith(assert, "These lines \n", text);
});
QUnit.test('getVisibleText should not trim non-breaking spaces at the start of a line in the middle of text', function(assert) {
var text = getVisibleTextByElementId("multilinetrailingnbsp");
assertContains(assert, "\n have", text);
});
QUnit.test('getVisibleText should not trim trailing non-breaking spaces in multiline text', function(assert) {
var text = getVisibleTextByElementId("multilinetrailingnbsp");
assertEndsWith(assert, "trailing NBSPs ", text);
});
QUnit.test('getVisibleText inline elements should not affect returned text', function(assert) {
var text = getVisibleTextByElementId("inline");
assert.strictEqual(text, "This line has text within elements that are meant" +
" to be displayed inline");
});
QUnit.test('getVisibleText should return the entire text of inline elements', function(assert) {
var text = getVisibleTextByElementId("span");
assert.strictEqual(text, "An inline element");
});
QUnit.test('getVisibleText should return empty string when text is only spaces', function(assert) {
var text = getVisibleTextByElementId("spaces");
assert.strictEqual(text, "");
});
QUnit.test('getVisibleText should return empty string when text is empty', function(assert) {
var text = getVisibleTextByElementId("empty");
assert.strictEqual(text, "");
});
QUnit.test('getVisibleText should return empty string when tag is self closing', function(assert) {
var text = getVisibleTextByElementId("self-closed");
assert.strictEqual(text, "");
});
QUnit.test('getVisibleText should not trim spaces when line wraps', function(assert) {
var text = getVisibleTextByElementId("wrappingtd");
assert.strictEqual(text, "beforeSpace afterSpace");
});
QUnit.test('getVisibleText correctly handles an entire table', function(assert) {
var text = getVisibleTextByElementId("wrappingtable");
assert.strictEqual(text, "beforeSpace afterSpace");
});
QUnit.test('getVisibleText should handle sibling block level elements', function(assert) {
var text = getVisibleTextByElementId("twoblocks");
assert.strictEqual(text, "Some text\nSome more text");
});
QUnit.test('getVisibleText should handle nested block level elements', function(assert) {
var text = getVisibleTextByElementId("nestedblocks");
assert.strictEqual(text, "Cheese\nSome text\nSome more text\nand also\nBrie");
});
QUnit.test('getVisibleText should handle whitespace in inline elements', function(assert) {
var text = getVisibleTextByElementId("inlinespan");
assert.strictEqual(text, "line has text");
});
QUnit.test('getVisibleText should handle lack of spaces between inline elements', function(assert) {
var text = getVisibleTextByElementId("inlinenospaces");
assert.strictEqual(text, "oooOooo");
var text2 = getVisibleTextByElementId("inlinenospaces2");
assert.strictEqual(text2, "A B");
});
QUnit.test('getVisibleText should not add extra spaces', function(assert) {
var text = getVisibleTextByElementId("descartes");
var text2 = getVisibleTextByElementId("abc");
assert.strictEqual(text, "Dubito, ergo cogito, ergo sum.");
assert.strictEqual(text2, "a bc");
});
QUnit.test('getVisible test get text with line break for inline element', function(assert) {
var text = getVisibleTextByElementId("label1");
assertContains(assert, "foo\nbar", text);
});
QUnit.test('getVisibleText should only include visible text', function(assert) {
var empty = getVisibleTextByElementId("suppressedParagraph");
var explicit = getVisibleTextByElementId("outer");
assert.strictEqual(empty, "");
assert.strictEqual(explicit, "sub-element that is explicitly visible");
});
QUnit.test('getVisibleText on anchors with whitespaces', function(assert) {
var text = getVisibleTextByElementId("links");
assert.strictEqual(text, "link with leading space " + "link with trailing space " +
"link with formatting tags");
});
QUnit.test('getVisibleText handles trailing whitespaces', function(assert) {
var text = getVisibleTextByElementId("trailingSpaces");
assert.strictEqual(text, "1 2 3 4");
});
QUnit.test('getVisibleText handles trailing breaks', function(assert) {
var text = getVisibleTextByElementId("trailingBreaks");
assert.strictEqual(text, "a\nb");
});
QUnit.test('keeps non-breaking spaces before a tag', function(assert) {
var text = getVisibleTextByElementId("id2");
assert.strictEqual(text, "this is the second element");
});
QUnit.test('removes zero width characters', function(assert) {
var text = getVisibleTextByElementId("zerowidth");
assert.strictEqual(text, "This line has a bunch of zero-width characters in it.");
});
QUnit.test('transparent text is ignored', function(assert) {
var text = getVisibleTextByElementId("opaque");
assert.strictEqual(text, "Some text");
});
QUnit.test('should retain the formatting of text within a pre element', function(assert) {
var text = getVisibleTextByElementId("preformatted");
assert.strictEqual(text, " This section has a preformatted\n text block\n split in four lines\n ");
});
QUnit.test('should retain the formatting of text within a pre element that is within a regular block', function(assert) {
var text = getVisibleTextByElementId("div-with-pre");
assert.strictEqual(text, "before pre\n This section has a preformatted\n text block\n split in four lines\n \nafter pre");
});
QUnit.test('getVisibleText should handle css content replacement', function(assert) {
var supportsContentReplacement = !(goog.userAgent.GECKO || goog.userAgent.IE ||
goog.userAgent.SAFARI || goog.userAgent.WEBKIT || goog.userAgent.EDGE);
if (!supportsContentReplacement) {
assert.ok(true, "Skipping: Does not support CSS3 content: 'foo' replacement");
return;
}
var text = getVisibleTextByElementId("css3-content");
assert.strictEqual(text, "PASS");
});
QUnit.test('getVisibleText should handle text transform property', function(assert) {
var text = getVisibleTextByElementId("capitalized");
assert.strictEqual(text, "Hello, World! Bla-Bla-BLA");
text = getVisibleTextByElementId("lowercased");
assert.strictEqual(text, "hello, world! bla-bla-bla");
text = getVisibleTextByElementId("uppercased");
assert.strictEqual(text, "HELLO, WORLD! BLA-BLA-BLA");
text = getVisibleTextByElementId("capitalized_accented_character");
assert.strictEqual(text, "Fecha De Expiración");
text = getVisibleTextByElementId("capitalized_enye");
assert.strictEqual(text, "Mañana");
text = getVisibleTextByElementId("capitalized-1");
assert.strictEqual(text, "Äåìî");
text = getVisibleTextByElementId("capitalized-2");
assert.strictEqual(text, "Manipulowanie Przepływem");
text = getVisibleTextByElementId("capitalized-3");
assert.strictEqual(text, "Manipulowanie Przepływem");
text = getVisibleTextByElementId("capitalized-4");
assert.strictEqual(text, "Manipulowanie Pr0123z4epływem");
text = getVisibleTextByElementId("capitalized-5");
assert.strictEqual(text, "Lorem Ipsum Dolor Sit Amet, Consectetur Adipisicing Elit,");
text = getVisibleTextByElementId("capitalized-6");
assert.strictEqual(text, "Ⓐⓑⓒ (Ⓓⓔⓕ) —Ⓖⓗⓘ— Ⓙkl");
text = getVisibleTextByElementId("capitalized-7");
assert.strictEqual(text, '(This) "Is" [A] –Short– -Test- «For» *The* _Css_ ¿Capitalize? ?¡Transfor');
text = getVisibleTextByElementId("capitalized-8");
assert.strictEqual(text, 'The Dutch Word: "Ijsland" Starts With A Digraph');
text = getVisibleTextByElementId("capitalized-9");
assert.strictEqual(text, 'Test_text');
});
function getVisibleTextByElementId(id) {
var e = bot.locators.findElement({id: id});
return bot.dom.getVisibleText(e);
}
function assertContains(assert, expectedText, text) {
assert.ok(text.indexOf(expectedText) >= 0,
"Text [" + text + "] does not contain [" + expectedText + "]");
}
function assertStartsWith(assert, expectedText, text) {
assert.ok(text.indexOf(expectedText) == 0,
"Text [" + text + "] does not start with [" + expectedText + "]");
}
function assertEndsWith(assert, expectedText, text) {
assert.ok(text.lastIndexOf(expectedText) == text.length - expectedText.length,
"Text [" + text + "] does not end with [" + expectedText + "]");
}
QUnit.test('bug exposed by issue 1293', function(assert) {
var spaces = getVisibleTextByElementId('spaces');
assert.strictEqual(spaces, '');
var table = getVisibleTextByElementId('wrappingtd');
assert.strictEqual(table, 'beforeSpace afterSpace');
});
</script>
<style type="text/css">
.transparent {
opacity: 0; /* non IE */
filter:alpha(opacity=0); /* IE 6+ */
}
</style>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<p id="oneline">A single line of text</p>
<div id="multiline">
<div>
<p>A div containing</p>
More than one line of text<br/>
<div>and block level elements</div>
</div>
</div>
<span id="span">An inline element</span>
<p id="lotsofspaces">This line has lots
of spaces.
</p>
<p id="nbsp">This line has a&nbsp;non-breaking space</p>
<p id="spaces"> </p>
<p id="empty"></p>
<p id="self-closed" />
<p id="suppressedParagraph" style="display: none">A paragraph suppressed using CSS display=none</p>
<p id="outer" style="visibility: hidden">A <b id="visibleSubElement" style="visibility: visible">sub-element that is explicitly visible</b> using CSS visibility=visible</p>
<p id="script">Some text<script>function shouldIgnoreMe() {}</script> that contains script tags</p>
<p id="nbspandspaces">This line has a &nbsp; non-breaking space and spaces</p>
<p id="trailingnbsp">This line has trailing non-breaking spaces&nbsp;&nbsp;&nbsp;</p>
<p id="multilinetrailingnbsp">These lines &nbsp<br />&nbsp have leading and trailing NBSPs&nbsp;&nbsp;</p>
<p id="css3-content" style="content: 'PASS'">FAIL</p>
<p id="inline">This <span id="inlinespan"> line has <em>text</em> </span> within elements that are meant to be displayed
<!-- not as a block but --> inline</p>
<div id="div-with-pre">
<p>before pre</p>
<pre id="preformatted"> This section has a preformatted
text block
split in four lines
</pre>
<p>after pre</p>
</div>
<div id="twoblocks"><p>Some text</p><p>Some more text</p></div>
<div id="nestedblocks">Cheese <div><p>Some text</p><div><p>Some more text</p><p>and also</p></div></div>Brie</div>
<div id="collapsingtext"><span></span><div>Hello, world</div><span></span></div>
<div id="inlinenospaces">ooo<strong>O</strong>ooo</div>
<div id="inlinenospaces2"><span>A <span></span>B</span></div>
<form action="resultPage.html">
<p>
<input type="checkbox" id="checkbox1">
<label id="label1" for="checkbox1">foo<br />bar</label>
</p>
</form>
<div id="links">
<a href=""> link with leading space</a>
<a href="" id="linkWithTrailingSpace">link with trailing space
</a>
<a href=""><b>link with formatting tags</b></a>
</div>
<div id="trailingSpaces">
1
<a href="">2</a>
3
<a href="">4</a></div>
<div id="trailingBreaks">
<span>a<br></span><span>b</span>
</div>
<table id="wrappingtable">
<tbody>
<tr><td id="wrappingtd" style="width: 10px;"><span>beforeSpace</span><span> </span><span>afterSpace</span></td></tr>
</tbody>
</table>
<span><strong id="descartes">Dubito, <em>ergo cogito</em>, ergo sum.</strong></span>
<span id="abc"><b>a</b> <b>b</b>c</span>
<a id="id2" >this is the&nbsp;<b>second</b> <span>element</span></a>
<div id="opaque">Some <span class="transparent">transparent</span> text</div>
<span id="zerowidth">This line has a bunch of ze&#8203;ro-width&lrm; characters&rlm; in it.</span>
<div>
<a id="capitalized" style="text-transform: capitalize">hello, world! bla-bla-BLA</a><br/>
<a id="lowercased" style="text-transform: lowercase">Hello, world! bla-bla-BLA</a><br/>
<a id="uppercased" style="text-transform: uppercase">hello, world! bla-bla-BLA</a><br/>
</div>
<div>
<a id="capitalized_accented_character" style="text-transform: capitalize">Fecha de expiración</a><br/>
<a id="capitalized_enye" style="text-transform: capitalize">mañana</a><br/>
</div>
<div>
<a lang="ru" id="capitalized-1" style="text-transform: capitalize">äåìî</a><br/>
<a id="capitalized-2" style="text-transform: capitalize">Manipulowanie przepływem</a><br/>
<a id="capitalized-3" style="text-transform: capitalize">manipulowanie przep&#x142ywem</a><br/>
<a id="capitalized-4" style="text-transform: capitalize">Manipulowanie pr0123z4epływem</a><br/>
<a id="capitalized-5" style="text-transform: capitalize">Lorem ipsum dolor sit amet, consectetur adipisicing elit,</a><br/>
<a id="capitalized-6" style="text-transform: capitalize">ⓐⓑⓒ (ⓓⓔⓕ) —ⓖⓗⓘ— ⓙkl</a><br/>
<a id="capitalized-7" style="text-transform: capitalize">(this) "is" [a] –short– -test- «for» *the* _css_ ¿capitalize? ?¡transfor</a><br/>
<a id="capitalized-8" style="text-transform: capitalize">The Dutch word: "ijsland" starts with a digraph</a><br/>
<a id="capitalized-9" style="text-transform: capitalize">test_text</a><br/>
</div>
</body>
</html>