当前位置:   article > 正文

Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题_chromedriver setscripttimeout

chromedriver setscripttimeout

使用selenuium chrome批量截图时,当某一个网页加载很慢时,get方法会阻塞到超时报错,一个报错后 标签页会停滞,url不再变化,而且之后的get也会不断报错:Timed out receiving message from renderer

在网上查阅解决办法不多,一个有效的方法是:使用一个备用标签页,当主标签页进行get跳转时超时了,就将主标签页关闭,使用备用标签页作为接下来的主标签页,并继续添加一个备用标签页。

添加标签页的方法网上查阅基本都是通过给driver发送键盘快捷键,如ctrl+t 开启新标签页,经实验我这里无效,只有使用一种执行js window.open的方法来开启标签页。

  1. public class ChromeDriverUtil {
  2. private static WebDriver driver = null;
  3. private final static int DEFAULT_TIMEOUT = 30;
  4. static {
  5. System.setProperty("java.awt.headless", "true");
  6. String driverPath = "D:/chromedriver.exe";//驱动需下载到指定目录
  7. ChromeOptions option = new ChromeOptions();
  8. option.addArguments("disable-infobars");
  9. option.addArguments("start-maximized");
  10. //option.addArguments("headless");
  11. System.setProperty("webdriver.chrome.driver", driverPath);
  12. driver = new ChromeDriver(option);
  13. driver.manage().timeouts().pageLoadTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
  14. driver.manage().timeouts().setScriptTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
  15. }
  16. public static void setTimeOut(int second) {
  17. driver.manage().timeouts().pageLoadTimeout(second, TimeUnit.SECONDS);
  18. driver.manage().timeouts().setScriptTimeout(second, TimeUnit.SECONDS);
  19. }
  20. public static WebDriver getDriver() {
  21. return driver;
  22. }
  23. public static void quit() {
  24. if (driver != null) {
  25. driver.quit();
  26. }
  27. }
  28. public static boolean getScreenshot(String url, String filePath) {
  29. WebDriver driver = getDriver();
  30. setTimeOut(60);
  31. newTab();
  32. try {
  33. driver.get(url);
  34. alertPersent();
  35. Thread.sleep(3 * 1000);
  36. //((JavascriptExecutor)driver).executeScript("window.stop();");
  37. File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
  38. FileUtils.copyFile(screenshot, new File(filePath));
  39. } catch (TimeoutException e) {
  40. System.out.println("打开页面超时:" + url);
  41. driver.close();
  42. newTab();
  43. return false;
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. System.out.println("截屏失败:" + url);
  47. return false;
  48. }
  49. System.out.println("截屏完成:" + url);
  50. return true;
  51. }
  52. //处理alert窗口
  53. private static void alertPersent() {
  54. try {
  55. getDriver().switchTo().alert().accept();
  56. } catch (NoAlertPresentException ignored) {
  57. }
  58. }
  59. private static void newTab(){
  60. ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
  61. if (tabs.size()<2){
  62. driver.switchTo().window(tabs.get(0));
  63. ((JavascriptExecutor)driver).executeScript("window.open('https://www.baidu.com');");
  64. tabs = new ArrayList<>(driver.getWindowHandles());
  65. driver.switchTo().window(tabs.get(0));
  66. }
  67. tabs = new ArrayList<>(driver.getWindowHandles());
  68. while (tabs.size()>2){
  69. driver.switchTo().window(tabs.get(tabs.size()-1));
  70. driver.close();
  71. tabs = new ArrayList<>(driver.getWindowHandles());
  72. }
  73. }
  74. /**
  75. * 外部直接调用该方法
  76. */
  77. public static void main(String[] args) throws InterruptedException {
  78. ChromeDriverUtil.getScreenshot(homeUrl, filePath);
  79. }
  80. }

通过该程序我批量截取了700个网站 没有出现一直报错的情况,最后的while(tabs.size())>2 是我后加的 不知道为什么会出现好几个备用标签页,通过这个判断 关闭多余的标签页。其实并不影响主要截图逻辑。如果出错删掉该段即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/178003
推荐阅读
相关标签
  

闽ICP备14008679号