【问题标题】:Can Protractor click Flash's "Adobe Flash Player Settings" prompt?Protractor 可以点击 Flash 的“Adobe Flash Player 设置”提示吗?
【发布时间】:2015-08-07 04:33:22
【问题描述】:

我的 Protractor 套件在使用 Flash 捕捉摄像头和麦克风的网络应用上运行。当然,任何人第一次使用该应用程序时,Flash 都会弹出一个对话框,询问是否允许使用网络摄像头和麦克风。

此对话框的 HTML 如下所示:

<div id="flash-container" class="">
<object width="247" height="159" id="flashRecorder" type="application/x-shockwave-flash" data="EIRecorderProcess.swf" style="visibility: visible;">
<param name="allowScriptAccess" value="always">
<param name="wmode" value="transparent">
</object>
</div>

而对话框本身是这样的:

量角器在这里挂起,因为它似乎不知道如何单击“允许”按钮,并且应用程序不会让它继续,直到它这样做。这是我尝试过的:

  1. 我访问了特定于站点的 Flash 安全设置以允许访问 对于网络应用程序。但是每次 WebDriver 运行时,它都会创建一个 Chrome 上的临时配置文件,它不知道这些安全性 设置,所以无论如何都会弹出设置框。

  2. 我设置了 Protractor 配置文件以使用选项运行 Chrome '使用假设备换媒体流','使用假用户界面换媒体流', 和“禁用捆绑的 ppapi-flash”。前两个没什么区别。 最后一个真的打破了一切。

  3. 我试过用这个:

    browser.actions()
    .mouseMove(element(by.css('object#flashRecorder')), x, y)
    .click()
    .perform();
    

    即使我是个高手,而且我很确定我已经搞定了按钮 坐标(确定使用了一些 javascript 坐标跟踪),什么也没发生。

  4. 我使用了 Chrome 标志“user-data-dir=/a/random/path”,以便在第一个 时间点击对话框并单击“允许”和“记住”,安全设置为 已存储且不会弹出 不再。这是当前的解决方法,但会为任何 想要运行测试的开发人员,而我的程序员说这不是犹太教 需要人工交互的自动化测试。

有没有人找到另一种方法来做到这一点?

【问题讨论】:

  • --use-fake-ui-for-media-stream 参数应该可以解决问题。你能展示你是如何将它传递给chrome的吗?谢谢。
  • 以下是我的 protractor.conf.js 中的相关行:capabilities: { 'browserName': 'chrome', 'chromeOptions': { 'args': ['use-fake-device-for -media-stream', 'use-fake-ui-for-media-stream'] }, },
  • 如果你尝试这种方式呢? capabilities: { 'browserName': 'chrome', 'chromeOptions': { 'args': ['--use-fake-ui-for-media-stream'] }, }
  • @alecxe,我也试过这样。 chromeOptions 数组不需要您在命令行上需要的双破折号。我用非常明显的“show-fps-counter”进行了测试,以确保它们通过了。
  • 好的,谢谢,我之前一直放--,只是想检查一下。很高兴知道。

标签: angularjs automated-tests protractor flash


【解决方案1】:

这不是 Chrome 提示权限;它是闪存。所以标准的 Chrome hack(例如,--use-fake-ui-for-media-stream)在这里不起作用。

我通过生成需要的Flash权限文件,并上传到相应的目录来解决这个问题,这样Flash就满足了。

您需要的 Flash 权限存储在一个名为“settings.sol”的文件中,该文件位于您正在访问的主机的特定目录中。该文件是 AMF 格式,我使用 Python PyAMF 库来生成它。它的工作原理是这样的:

from pyamf import sol

object = sol.SOL ('www.hostname.com/settings')
object[u'allow'] = True
object[u'always'] = True
object[u'klimit'] = 100
sol.save (object, 'settings.sol')

不是名称中指定的“www.hostname.com”; 必须是请求权限的主机名。

然后您必须将此文件上传到您可能必须创建的正确目录,并且该目录特定于主机名。

Chrome 中实际上有两个目录;一种用于 NPAPI Flash(Chrome 45 中即将淘汰的旧技术),另一种用于 Pepper Flash(新技术)。

旧的 (NPAPI) Flash 权限存储在固定位置,目录路径包含主机名(上例中为“www.hostname.com”):

C:\Users\UserName\AppData\Roaming\Macromedia\Flash Player\macromedia.com\support\flashplayer\sys\#www.hostname.com\settings.sol

新的(Pepper)Flash 权限存储在用户的 Chrome 目录中,正如您所指出的,该目录是由 WebDriver 为每个浏览器实例创建的。 WebDriver 在“chrome”功能的“userDataDir”键中将该目录返回给您。再次在 Python 中:

user_dir = my_driver.capabilities.get ('chrome').get ('userDataDir')

然后需要将settings.sol文件放到以下目录,你必须创建:

[user_dir]\Default\Pepper Data\Shockwave Flash\WritableRoot\#SharedObjects\12345678\macromedia.com\support\flashplayer\sys\#www.hostname.com\settings.sol

请注意此处的“12345678”。如果您让 Flash 创建权限文件,它将在此处使用半随机数。但由于这是一个新创建的用户目录,而且我们几乎创建了整个路径,所以我们可以只创建一个。

一旦您创建了适当的 settings.sol 文件,并创建了适当的目录结构,并将 settings.sol 文件上传到该目录结构中的正确位置,Flash 就会找到该授予权限的文件,它会不再提示你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2011-03-23
    • 2014-12-18
    相关资源
    最近更新 更多