You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UnnecessaryScrollbarWhenZoomingTest.java 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package com.vaadin.tests.components.table;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertNotNull;
  4. import static org.junit.Assert.fail;
  5. import java.util.Arrays;
  6. import org.junit.After;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import org.openqa.selenium.JavascriptExecutor;
  10. import org.openqa.selenium.Keys;
  11. import org.openqa.selenium.WebDriver;
  12. import org.openqa.selenium.WebElement;
  13. import org.openqa.selenium.remote.DesiredCapabilities;
  14. import org.openqa.selenium.support.ui.ExpectedConditions;
  15. import org.openqa.selenium.support.ui.WebDriverWait;
  16. import com.vaadin.testbench.By;
  17. import com.vaadin.testbench.commands.TestBenchCommandExecutor;
  18. import com.vaadin.testbench.parallel.BrowserUtil;
  19. import com.vaadin.tests.tb3.MultiBrowserTest;
  20. public class UnnecessaryScrollbarWhenZoomingTest extends MultiBrowserTest {
  21. private ZoomLevelSetter zoomSetter;
  22. private int zoomOutIterations = 3;
  23. private int zoomInIterations = 3;
  24. @Before
  25. public void init() {
  26. testBench().resizeViewPortTo(995, 400);
  27. DesiredCapabilities capabilities = getDesiredCapabilities();
  28. if (BrowserUtil.isChrome(capabilities)
  29. || BrowserUtil.isPhantomJS(capabilities)) {
  30. zoomSetter = new ChromeZoomLevelSetter(driver);
  31. } else {
  32. zoomSetter = new NonChromeZoomLevelSetter(driver);
  33. }
  34. zoomSetter.resetZoom();
  35. openTestURL();
  36. // IE sometimes has trouble waiting long enough.
  37. waitUntil(ExpectedConditions.presenceOfElementLocated(
  38. By.cssSelector(".v-table-body-wrapper")), 30);
  39. }
  40. @Test
  41. public void testInitial() {
  42. testExtraScrollbarsNotShown();
  43. }
  44. @Test
  45. public void testZoomingIn() {
  46. for (int i = 0; i < zoomInIterations; i++) {
  47. zoomSetter.increaseZoom();
  48. testExtraScrollbarsNotShown();
  49. }
  50. }
  51. @Test
  52. public void testZoomingOut() throws InterruptedException {
  53. for (int i = 0; i < zoomOutIterations; i++) {
  54. zoomSetter.decreaseZoom();
  55. testExtraScrollbarsNotShown();
  56. }
  57. }
  58. @After
  59. public void resetZoomLevel() {
  60. zoomSetter.resetZoom();
  61. }
  62. private void testExtraScrollbarsNotShown() {
  63. // wait a bit for the layout
  64. try {
  65. Thread.sleep(1000);
  66. } catch (InterruptedException e) {
  67. fail();
  68. }
  69. WebElement element = findElement(
  70. By.cssSelector(".v-table-body-wrapper"));
  71. assertNotNull("There must be a table", element);
  72. String overflow = element.getCssValue("overflow");
  73. // As long as the overflow is hidden, there will not be scroll bars.
  74. if (!"hidden".equals(overflow)) {
  75. // compare scroll width to offset width. True if scrolling.
  76. String detectHorizontalScroll = "return arguments[0].scrollWidth > arguments[0].clientWidth";
  77. Boolean horizontal = (Boolean) ((TestBenchCommandExecutor) getDriver())
  78. .executeScript(detectHorizontalScroll, element);
  79. assertEquals("there must be no horizontal scrollbar", false,
  80. horizontal);
  81. String detectVerticalScroll = "return arguments[0].scrollHeight > arguments[0].clientHeight";
  82. Boolean vertical = (Boolean) ((TestBenchCommandExecutor) getDriver())
  83. .executeScript(detectVerticalScroll, element);
  84. assertEquals("there must be no vertical scrollbar", false,
  85. vertical);
  86. }
  87. }
  88. interface ZoomLevelSetter {
  89. public void increaseZoom();
  90. public void decreaseZoom();
  91. public void resetZoom();
  92. }
  93. /*
  94. * A class for setting the zoom levels by sending keys such as ctrl and +.
  95. */
  96. class NonChromeZoomLevelSetter implements ZoomLevelSetter {
  97. private WebDriver driver;
  98. public NonChromeZoomLevelSetter(WebDriver driver) {
  99. this.driver = driver;
  100. }
  101. @Override
  102. public void increaseZoom() {
  103. getElement().sendKeys(Keys.chord(Keys.CONTROL, Keys.ADD));
  104. }
  105. @Override
  106. public void decreaseZoom() {
  107. getElement().sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
  108. }
  109. @Override
  110. public void resetZoom() {
  111. getElement().sendKeys(Keys.chord(Keys.CONTROL, "0"));
  112. }
  113. private WebElement getElement() {
  114. return driver.findElement(By.tagName("html"));
  115. }
  116. }
  117. /*
  118. * A class for setting the zoom levels using JavaScript. This setter is used
  119. * for browsers for which the method of sending the keys ctrl and + does not
  120. * work.
  121. */
  122. class ChromeZoomLevelSetter implements ZoomLevelSetter {
  123. private JavascriptExecutor js;
  124. private int currentZoomIndex = 2;
  125. private int[] zoomLevels = { 70, 80, 90, 100, 110, 120, 130 };
  126. public ChromeZoomLevelSetter(WebDriver driver) {
  127. js = (JavascriptExecutor) driver;
  128. }
  129. @Override
  130. public void increaseZoom() {
  131. currentZoomIndex++;
  132. if (currentZoomIndex >= zoomLevels.length) {
  133. currentZoomIndex = zoomLevels.length - 1;
  134. }
  135. js.executeScript("document.body.style.zoom='"
  136. + zoomLevels[currentZoomIndex] + "%'");
  137. }
  138. @Override
  139. public void decreaseZoom() {
  140. currentZoomIndex--;
  141. if (currentZoomIndex < 0) {
  142. currentZoomIndex = 0;
  143. }
  144. js.executeScript("document.body.style.zoom='"
  145. + zoomLevels[currentZoomIndex] + "%'");
  146. }
  147. @Override
  148. public void resetZoom() {
  149. js.executeScript("document.body.style.zoom='100%'");
  150. currentZoomIndex = Arrays.binarySearch(zoomLevels, 100);
  151. }
  152. }
  153. }