【问题标题】:Unable to perform click on button using selenium flex api?无法使用 selenium flex api 执行单击按钮?
【发布时间】:2017-05-18 19:01:14
【问题描述】:
我有一个已经用 Selenium Flex 重新编译的 Flash 应用程序。
使用 FlashFirebug,我能够找到该应用程序的定位器,并且我已经使用 Selenium RC 的 selenium flex API 编写了脚本,当我运行脚本时,这些定位器被识别但无法执行操作。
在 selenium IDE 中,也可以识别这些定位器,但无法执行 click 之类的操作。在这里,我已将 user-extension.js 附加到我的 IDE。
【问题讨论】:
标签:
apache-flex
selenium
automation
【解决方案1】:
这就是我找到问题根源的方法:
- 确保您的 *.swf(flex 应用程序)是针对 Selenium-Flex API *.swc 库正确编译的
- 在带有 Javascript 调试控制台的网络浏览器中运行您的 swf(例如带有 Firebug 的 Firefox)。
- 使用 Javascript 控制台,使用 DOM ID -
document.getElementById(swfId) 获取对 swf 的引用
- 现在,通过运行它为 Selenium 公开的测试命令之一来测试 Flex-Selenium 是否已编译到您的 swf OK 中。这些命令是在上一步中获得的对象上执行的 Javascript 函数 - 有关详细信息,请参阅accessing a Flex app from Javascript。 Flex-Selenium 公开的所有命令都可以在 Commmands.as 的 Flex-Selenium 源代码中找到。例如,
ExternalInterface.addCallback("doFlexMouseDown", mouseCommands.doFlexMouseDown); 表示名为 doFlexMouseDown 的 Javascript 函数(在 MouseCommands.as 中定义)已在您的 swf 中公开。执行 Javascript 表达式 typeof document.getElementById('swfId').doFlexMouseDown 应该评估为 function(而不是 undefined)。您还应该能够毫无错误地调用此函数 - document.getElementById(swfId).doFlexClick('idOfFlexObject') 其中idOfFlexObject 是您的 swf 中某个对象(例如按钮)的 ID。
- 所以,现在您应该能够找到您在通过 selenium 调用您的 swf 时遇到问题的命令,并在您的 Javascript 调试控制台中针对 swf 测试它们是否有错误。
- 如果您的 swf 确实是针对您的 swf 正确编译的,那么当您针对您的 swf 调用相应的 Javascript 函数时,您很可能会遇到错误(Javascript 函数本身已正确定义并暴露给 Javascript,但错误是调用时在您的 swf 中发生)。然后,您可以通过下载 Flex-Selenium 的源代码(请参阅前面的超链接)并将 flex 调试器附加到您的 swf 并在其搜索路径中使用此源代码来查找此错误的原因。您将在执行失败的命令时设置一个断点。根据我自己的经验,我不得不自定义和修复 Flex-Selenium 源代码中的小错误。
- 如果您在 Javascript 调试控制台上没有观察到错误,您应该发布堆栈跟踪,其中 Selenium RC 无法针对您的 swf 运行命令,因为您使用或配置 Selenium RC (或 Selenium IDE)是问题所在。
【解决方案2】:
通过SFAPI(Slenium Flex API)点击flex应用非常简单
您必须使用 SeleniumFlexAPI.swc 文件编译您的弹性代码,您将在 SFAPI 文件夹中获得该文件,对于这些 SFAPI 文件,
你需要按照这些步骤See here
或see example here