使用 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元素