使用 Phantomjs Watir 访问 iFrame

Posted

技术标签:

【中文标题】使用 Phantomjs Watir 访问 iFrame【英文标题】:Accessing iFrames with Phantomjs Watir 【发布时间】:2014-10-27 06:41:51 【问题描述】:

我的脚本正在尝试访问此登录页面:

http://instagram.com/accounts/login

使用 PhantomJS,Watir。

登录页面的问题在于登录文本字段位于 iFrame 中:

<iframe class="hiFrame" data-reactid=".0.0.0.1.0.1.0.0.$frame" src="https://instagram.com/accounts/login/ajax/?targetOrigin=https%3A%2F%2Finstagram.com" scrolling="no" seamless="">
  #document
  <!DOCTYPE html>
  <html class="hl-en not-logged-in " lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body class="LoginFormChrome ">
      <div class="LoginFormPage" data-reactid=".0">
        <form data-reactid=".0.0">
          <p class="lfField" data-reactid=".0.0.0">
            <label class="lfFieldLabel" data-reactid=".0.0.0.0"></label>
            <input class="lfFieldInput" type="text" data-reactid=".0.0.0.1" value="" autocorrect="false" autocapitalize="false" maxlength="30" name="username"></input>
          </p>
          <p class="lfField" data-reactid=".0.0.1"></p>
          <p class="lfActions" data-reactid=".0.0.2"></p>
        </form>
      </div>
      <div id="fb-root" class=" fb_reset"></div>
    </body>
  </html>
</iframe>

这是我的代码(Ruby):

B.goto HOME_URL + LOGIN
sleep(5)            
puts B.iframe(:class => "hiFrame").text_field(:name => "username").exists?
B.iframe(:class => "hiFrame").text_field(:name => "username").set USERNAME
B.iframe(:class => "hiFrame").text_field(:name => "password").set PW
#puts B.iframe(:class => "hiFrame").text_field(:name => "username").exists?
B.iframe(:class => "hiFrame").button.click

使用 Firefox 浏览器可以正常工作,但是当我切换到 Phantomjs 时,它无法识别

B.iframe(:class => "hiFrame").text_field(:name => "username").exists?

并停止脚本。返回“真”:

B.iframe(:class => "hiFrame").exists?

但这就是它的范围。如何使用 phantomjs 和 watir 登录 instagram?

谢谢。

【问题讨论】:

看起来框架正在显示 Facebook 跨域信使助手。您可能需要查看 PhantomJS 是否支持跨域 iframe。 如果 PhantomJS 不这样做会怎样?有没有其他方法可以无头访问 iframe? 你可以试试headless gem。没用过,不知道有什么限制。 嗨贾斯汀,我试图寻找 PhantomJS 是否支持跨域框架,但我找不到任何东西......我只找到了这个。控制 Web 安全 执行跨域 XHR 通常对于某些脚本目的是必要的。现在可以通过禁用网络安全(问题 28)来实现这一点,或者使用 --web-security=no 命令行选项或 webSecurityEnabled 页面设置。 如果我要远程运行我的脚本,它还能工作吗? 【参考方案1】:

在你进入页面之前尝试在你的代码中添加这个:

B = Watir::Browser.new :phantomjs
B.window.resize_to(800, 600)

如果您设置了窗口大小,它应该可以工作。 Phantomjs 通常需要指定浏览器大小。

B.window.resize_to(800, 600)
B.goto HOME_URL + LOGIN
sleep(5)            
puts B.iframe(:class => "hiFrame").text_field(:name => "username").exists?
B.iframe(:class => "hiFrame").text_field(:name => "username").set USERNAME
B.iframe(:class => "hiFrame").text_field(:name => "password").set PW
#puts B.iframe(:class => "hiFrame").text_field(:name => "username").exists?
B.iframe(:class => "hiFrame").button.click

【讨论】:

以上是关于使用 Phantomjs Watir 访问 iFrame的主要内容,如果未能解决你的问题,请参考以下文章

在 phantomjs 中访问 iframe 的 contentDocument

selenium 2和watir webdriver中怎么在启动浏览器时保留cookie

PhantomJS 无法访问自签名 HTTPS 页面 Codeception

使用带有量角器的phantomjs访问iframe中的web元素

使用 PhantomJS 在 HTML 中访问 JS 全局变量的值

Watir 错误 - 无法运行 Watir 代码示例