Geb/Selenium 测试挂起加载新页面

2023-12-09

我的 Selenium 测试经常无限期地挂在 CI 上,总是尝试加载新页面driver.get。我正在使用 PhantomJS 1.9.8。

经过几轮调试,我想我已经将问题追溯到 PhantomJS 中网页加载未完成的问题。

Selenium RemoteWebDriver 已向 PhantomJS/GhostDriver 发送请求,并且正在等待响应。

GhostDriver 仍在接受请求。我可以通过点击查看它卡在哪个页面上curl http://localhost:port/session/:sessionId/url此外,如果我重新请求同一页从命令行(curl -d '{"url": ...}' http://localhost:port/session/:sessionId/url)然后被阻止的 Selenium 请求会神奇地从中断处恢复。

UPDATE:Ghostdriver 本身并没有挂起——不过它的默认超时基本上是无限的。如果我指定页面加载超时,例如,manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS)那么当问题发生在 PhantomJS 中时,GhostDriver 将返回一个超时的错误响应,测试将失败,构建将继续。

如果我调试 PhantomJS 本身(--debug=TRUE),那么我将其视为故障点日志中的最后一件事

2015-03-21T21:26:39 [DEBUG] WebPage - updateLoadingProgress: 86(然后什么都不做,直到超时为止)

挂起时 Java 端的堆栈跟踪如下所示:

"Forwarding get on session fd1ac2c0-ccd4-11e4-a596-a1f7b09caa5d to remote" prio=10 tid=0x0000000001f74800 nid=0x5cc3 runnable [0x00002b87c3039000]
 java.lang.Thread.State: RUNNABLE
     at java.net.SocketInputStream.socketRead0(Native Method)
     at java.net.SocketInputStream.read(SocketInputStream.java:150)
     at java.net.SocketInputStream.read(SocketInputStream.java:121)
     at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
     at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
     at horg.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
     at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
     at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
     at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
     at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
     at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
     at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219)
     at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
     at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
     at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
     at org.openqa.selenium.remote.HttpCommandExecutor.fallBackExecute(HttpCommandExecutor.java:316)
     at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:295)
     at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:66)
     at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:527)
     at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:276)
     at org.openqa.selenium.WebDriver$get.call(Unknown Source)
     at geb.Browser.go(Browser.groovy:371)
     at geb.Browser$go.call(Unknown Source)
     at geb.Page.to(Page.groovy:169)

感觉与此类似,但使用 PhantomJS 而不是 Firefox:

Firefox WebDriver 挂起等待页面加载


我希望你能找到一种方法将其实现到你的代码中,但是当我遇到 PhantomJS 挂起的类似情况时,这对我有用。

我追踪到它挂在driver.get()呼叫,对我来说,这意味着某些事情没有完成,或者网络驱动程序只是没有 - 由于某种原因 - 给出加载成功命令返回给驱动程序,允许脚本继续执行。

所以,我添加了以下内容:

driver = webdriver.PhantomJS()

# set timeout information
driver.set_page_load_timeout(15)

我已经在 5(秒)的时间对此进行了测试,但它只是没有等待足够长的时间,什么也不会发生。 15 秒对我来说效果很好,但这也许是你应该测试的东西。

除此之外,每当网络驱动程序有一个超时选项时,我还创建了一个循环,以便driver.get()可以尝试重新发送.get()命令。实施一个try / except堆叠场景,我能够解决这个问题:

while finished == 0:
    try:
        driver.get(url3)
        finished = 1
    except:
        sleep(5)

我看到的 except 句柄为:

except TimeoutException as e:
    #Handle your exception here
    print(e)

但我对此没有用。不过,了解如何捕获特定异常可能会很好。

有关超时的更多选项,请参阅此解决方案:在 selenium webdriver.PhantomJS 上设置超时

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Geb/Selenium 测试挂起加载新页面 的相关文章

随机推荐

  • 为什么我的图像加载在 Firefox 和 Internet Explorer 中没有触发?

    我正在尝试使用该解决方案检测几张图像何时完成加载在这里找到 该解决方案在 Chrome 和 Safari 中运行良好 但在 Firefox 和 IE 中失败 没有错误 预加载函数如下 var preloadPictures function
  • Tensorflow 警告 - 无法加载动态库“cupti64_101.dll”; dlerror:找不到 cupti64_101.dll

    我见过与 cupti dll 错误相关的其他类似问题 然而 答案似乎是dll位置需要在路径中 嗯 我的 dll 在路径中 标题中列出的警告后面是几个与未加载 cupti dll 相关的错误 venv PS D Projects tensor
  • Grails 多数据源域问题

    我有一个项目 表分布在两个数据源之间 我正在配置代码以按照 grails 文档中的 3 3 6 主题访问表http grails org doc 2 0 0 M2 guide conf html dataSourcesAndEnvironm
  • 使用 cordova 1.5 的 xcode 没有准备好设备且没有 console.log

    这是我拥有的所有代码 我既没有得到 xcode 中的日志 也没有得到 deviceReady 事件 我在任何其他平台上也没有得到该事件 在 Ubuntu Android Eclipse 上 我确实得到了控制台日志 但没有 deviceRea
  • 检测时间线上的冲突,第 2 部分:隔离“真实”重叠

    这是我关于绘制重叠时间冲突的时间轴调度算法的原始问题的延续 PART 1 检测调度程序时间线上的冲突 算法 我得到了正确的算法 如下所示 在 24 小时时间轴上分割 冲突 事件 使冲突组中的每个项目占据窗口的 N 我当前的问题 第 2 部分
  • 相当于

    与 css 的 valign=center

    我的页面上有以下代码 p align left style font size 10pt display block height 200px Content p 我希望文本在中心垂直对齐p tag Using vertical align
  • protobuf-net :不支持 IExtensible 继承

    似乎无法实施protobuf net通过定义其子类型的类的序列化 ProtoInclude 并实施ProtoBuf IExtensible ProtoBuf ProtoInclude 1000 typeof DerivedClass pub
  • HTML 表单值和“后退”按钮

    如何在点击后退按钮时保留 HTML 表单信息 这是默认的 HTML 或浏览器行为吗 或者它依赖于浏览器 这是默认的浏览器行为 但仅当包含表单的页面可缓存时 例如设置了标头 以便允许浏览器缓存它 SO 的形式如何记住以前的输入值
  • JasperReports:如何在jsp页面中调用报表

    我使用 做了一份 jasper 报告iReport 3 7 4 version 现在我必须在我的 java 应用程序中使用它或调用该报告 我使用 servlet jsp 和 struts 框架 apache tomcat 作为服务器 我想要
  • 比较过程的内容,而不是结果

    使用 Ruby 1 9 2 Problem比较两个过程的内容 而不是结果 我了解结果无法测试 因为停止问题但没关系 反正我也不想测试结果 例如 proc x x proc x x gt false doh 这会返回 false 因为过程中的
  • 使用节流(“gopkg.in/throttled/throttled.v2”)库时出现错误

    当我尝试使用安装节流时go get命令 go get github com throttled throttled 我收到错误 can t load package package github com throttled throttle
  • 为什么 `object.__init__` 不带参数

    为什么不object init take args kwargs作为论据 据我所知 这以一种非常烦人的方式破坏了一些简单的代码 没有任何好处 假设我们要确保所有 init 调用所有父类的 只要每个 init 遵循调用的简单约定super i
  • 文本输入中的最小最大数字 - Jquery/javascript

    我想设置在文本输入中输入的最小和最大允许数字我知道我可以使用范围输入来做到这一点 但在不兼容的浏览器中使用时它仍然有最大和最小吗 如果没有 请为我指出正确的方向 感谢您的阅读 Use jquery 验证器插件 它有一组很好的功能 还有最小最
  • 有向无环图中的最长路径

    如何找到没有权重的 DAG 中的最长路径 我知道如果 DAG 是拓扑排序的 则可以在线性时间内找到从 A 到 B 的最长路径 但我需要找到所有图中的最长路径 有没有比搜索所有顶点对之间的最长路径 这将是 O n 3 更快的方法 这与寻找关键
  • App Engine 对除 root 之外的任何路径抛出 404 Not Found

    我想将我的 App Engine 实现拆分为多个文件 所以我在 app yaml 文件中写道 runtime python27 api version 1 threadsafe true handlers url imageuploader
  • 删除 TFS 2010 中的孤立身份

    我正在将 TFS 2010 安装从一台计算机移动到另一台计算机 我发现可以使用以下命令重新映射身份TFSConfig Identities change命令 但我没有找到删除我不再需要的孤立用户身份的方法 我知道也许我可以把它们留在那里 但
  • java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver错误[重复]

    这个问题在这里已经有答案了 try Class forName sun jdbc odbc JdbcOdbcDriver String cString jdbc odbc Driver Microsoft Access Driver mdb
  • 使用 apache poi 读取 Excel 文件时出现异常

    当我尝试使用 apache poi 读取 Excel 2007 文件 xlsx 文件扩展名时出现问题 InputStream file new FileInputStream C test xlsx gt XSSFWorkbook work
  • 用于会话检查的 Java FilterImplementation

    我使用 JSF Hibernate Spring 创建一个 Web 应用程序 我添加了一个过滤器来检查会话 我的过滤器代码是 public class AdminFilter implements Filter private ArrayL
  • Geb/Selenium 测试挂起加载新页面

    我的 Selenium 测试经常无限期地挂在 CI 上 总是尝试加载新页面driver get 我正在使用 PhantomJS 1 9 8 经过几轮调试 我想我已经将问题追溯到 PhantomJS 中网页加载未完成的问题 Selenium