SeleniumBrowser.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package jnpf.selenium.driver;
  2. import jnpf.selenium.SeleniumHelper;
  3. import jnpf.selenium.properties.SeleniumProperties;
  4. import org.openqa.selenium.*;
  5. import org.openqa.selenium.remote.AbstractDriverOptions;
  6. import org.openqa.selenium.remote.RemoteWebDriver;
  7. import org.openqa.selenium.remote.service.DriverService;
  8. import java.time.Duration;
  9. import java.util.List;
  10. import java.util.Map;
  11. public interface SeleniumBrowser<D extends RemoteWebDriver, S extends DriverService, O extends AbstractDriverOptions<?>> {
  12. D getDriver();
  13. S getDriverService();
  14. O getDriverOptions();
  15. /**
  16. * 关闭驱动和浏览器
  17. */
  18. void close();
  19. /**
  20. * 设置页面加载超时时间
  21. */
  22. default void setPageLoadTimeout(Duration duration) {
  23. getDriver().manage().timeouts().pageLoadTimeout(duration);
  24. }
  25. /**
  26. * 设置查找元素超时时间
  27. */
  28. default void setImplicaitlyWaitTimeout(Duration duration) {
  29. getDriver().manage().timeouts().implicitlyWait(duration);
  30. }
  31. /**
  32. * 设置执行脚本超时时间
  33. */
  34. default void setScriptTimeout(Duration duration) {
  35. getDriver().manage().timeouts().scriptTimeout(duration);
  36. }
  37. /**
  38. * 寻找元素, 若不存在抛出未找到元素异常
  39. * 如需判断元素是否存在可调用{@link #findElements} 进行判空处理, 为空获取默认超时配置 {@link SeleniumProperties#getImplicaitlyWaitTimeout()}
  40. *
  41. * @param locator 查找条件
  42. * @param findTimeout 最长等待时间
  43. */
  44. default WebElement findElement(By locator, Duration findTimeout) {
  45. findTimeout = findTimeout == null ? SeleniumHelper.getSeleniumProperties().getImplicaitlyWaitTimeout() : findTimeout;
  46. setImplicaitlyWaitTimeout(findTimeout);
  47. return getDriver().findElement(locator);
  48. }
  49. /**
  50. * 寻找元素, 未找到元素返回空
  51. *
  52. * @param locator 查找条件
  53. * @param findTimeout 最长等待时间, 为空获取默认超时配置 {@link SeleniumProperties#getImplicaitlyWaitTimeout()}
  54. */
  55. default List<WebElement> findElements(By locator, Duration findTimeout) {
  56. findTimeout = findTimeout == null ? SeleniumHelper.getSeleniumProperties().getImplicaitlyWaitTimeout() : findTimeout;
  57. setImplicaitlyWaitTimeout(findTimeout);
  58. return getDriver().findElements(locator);
  59. }
  60. /**
  61. * 加载页面
  62. * @param url 网页地址
  63. * @param loadTimeout 加载超时时间, 为空获取默认超时配置 {@link SeleniumProperties#getPageLoadTimeout()}
  64. * @param newTab 新窗口打开链接
  65. */
  66. default void loadPage(String url, Duration loadTimeout, WindowType newTab) {
  67. if (newTab != null) {
  68. getDriver().switchTo().newWindow(newTab);
  69. }
  70. loadTimeout = loadTimeout == null ? SeleniumHelper.getSeleniumProperties().getPageLoadTimeout() : loadTimeout;
  71. setPageLoadTimeout(loadTimeout);
  72. getDriver().get(url);
  73. }
  74. /**
  75. * 执行JS脚本
  76. * @param script 脚本内容
  77. * @param scriptTimeout 脚本执行超时时间, 为空获取默认超时配置 {@link SeleniumProperties#getScriptTimeout()}
  78. * @param args 脚本内容参数
  79. */
  80. default Object executeScript(String script, Duration scriptTimeout, Object... args){
  81. scriptTimeout = scriptTimeout == null ? SeleniumHelper.getSeleniumProperties().getScriptTimeout() : scriptTimeout;
  82. setScriptTimeout(scriptTimeout);
  83. return getDriver().executeScript(script, args);
  84. }
  85. /**
  86. * 获取最大的页面大小
  87. */
  88. default Dimension getDocumentSize() {
  89. Map<String, Long> result = (Map<String, Long>) getDriver().executeScript("return {'w':Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth), 'h':Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight)}");
  90. return new Dimension(Math.toIntExact(result.get("w")), Math.toIntExact(result.get("h")));
  91. }
  92. /**
  93. * 窗口最大化, 截取全部网页内容
  94. */
  95. default byte[] screenShotByWindow() {
  96. getDriver().manage().window().setSize(getDocumentSize());
  97. return getDriver().getScreenshotAs(OutputType.BYTES);
  98. }
  99. /**
  100. * 窗口最大化, 截取指定元素
  101. */
  102. default byte[] screenShotByElement(WebElement element) {
  103. getDriver().manage().window().setSize(getDocumentSize());
  104. return element.getScreenshotAs(OutputType.BYTES);
  105. }
  106. /**
  107. * 可能存在懒加载, 滚动页面到底部进行触发, 每次滚动完后延时指定时间等待触发
  108. * @param scrollDelay 每次滚动完后延时, 等待触发
  109. */
  110. default void scrollToBottom(Duration scrollDelay) {
  111. Dimension documentSize = getDocumentSize();
  112. long height = documentSize.getHeight();
  113. //这里需要模拟滑动,有些是滑动的时候才加载的
  114. long temp_height = 0;
  115. while (true) {
  116. temp_height += 500;
  117. if (temp_height >= height) {
  118. break;
  119. }
  120. getDriver().executeScript("window.scrollBy(0,500)");
  121. try {
  122. Thread.sleep(scrollDelay.toMillis());
  123. } catch (Exception e) {
  124. }
  125. }
  126. }
  127. }