我正在尝试使用FireWatir(1.6.5)使用Basic访问网站 身份验证,我一直无法找到适用的解决方案 Linux中的Firefox。 FireWatir 1.6.5是否支持基本身份验证 在Linux上?我已经在网上搜索了2天而且无法获得 直接回答如何做到这一点。
我找到的唯一有用的线索是这个( http://groups.google.com/group/watir-general/browse_thread/thread/d8ab9a177d282ce4/fc1bf2319fb387d8?lnk=gst&q=basic+authentication#fc1bf2319fb387d8)。
Aedorn Varanis说“Angrez的叉子有解决方案所以我正在使用它 现在。谢谢Angrez,工作得很完美!“,但他没有提到他是什么 做得好事。
最初我尝试使用以下方法绕过身份验证对话框:
browser.goto( 'http://admin:password@172.20.1.1')
然而,这会生成一个“确认”对话框,其中显示:
“您即将使用用户名登录网站”172.20.1.1“ “admin”。“[取消,确定]
此对话框阻止,直到我单击“确定”后才会返回goto调用。
然后我尝试添加:
browser.startClicker( “OK”) browser.goto( 'http://admin:password@172.20.1.1')
但是这个ALSO会生成相同的“确认”对话框。
我使用单元测试/ var /测试了startClicker功能 LIB /宝石/ 1.8 /宝石/ firewatir-1.6.5 /单元测试/ HTML / JavascriptClick.html 它工作正常,这让我觉得使用startClicker 方法不是处理确认对话框的正确方法。
其他人找到了让Basic Auth工作或如何点击的方法 确认对话框上的确定?我的智慧结束了......
答案 0 :(得分:0)
这可能是一个长期丑陋的解决方法,也可能违反了watir哲学的简单性,但是因为你的智慧结束了......
1)Sahi(http://sahi.co.in/)通过将其转换为常规网页来处理401认证对话框。
2)Sahi的代理需要运行,并指向浏览器使用Sahi的代理。
3)然后,您可以导航到您的页面,只需使用watir / firewatir在转换后的401认证网页中输入用户名密码(就像常规表格一样)。
你会承担代理的额外负担,但Sahi的表现相当好,所以你应该能够让它发挥作用。
如果您需要进一步的帮助,可以在这里或在Sahi的论坛上发帖。
希望有所帮助。 -Narayan
答案 1 :(得分:0)
在Aedorn Varanis的帮助下,我已经开始使用Firefox了 Linux操作系统。
Aedorn给我发了一个“登录”方法,它发出了一个jssh命令 检查“需要验证”对话框,如果存在,则填写 在用户名/密码中提交对话框。
我复制并粘贴了他发给我的内容:
您使用如下所示的方法:
def logon(username, password, wait=3)
jssh_command = "var length = getWindows().length; var win;var found=false; for(var i = 0; i < length; i++) { win = getWindows()[i]; if(win.document.title == \"Authentication Required\") { found = true; break; }} if(found) { var jsdocument = win.document; var dialog = jsdocument.getElementsByTagName(\"dialog\")[0];"
jssh_command << " jsdocument.getElementsByTagName(\"textbox\")[0].value = \"#{username}\";"
jssh_command << " jsdocument.getElementsByTagName(\"textbox\")[1].value = \"#{password}\";"
jssh_command << " dialog.getButton(\"accept\").click(); }\n"
sleep(wait)
$jssh_socket.send(jssh_command,0)
read_socket()
wait()
end
然后你可以自己调用它 在之前进入网站 登录要求:
Thread.new { logon(user, pass) } @ff.goto("http://some_url.com") sleep 3
如果增加等待和睡眠时间 该页面需要一段时间才能加载。如果你的 主进程尝试运行时 命令正在通过JSSH发送 插座,它会停转并坐在那里 永远直到被杀而且,没有 真正的方法来检测是否 验证窗口出现。那 意味着你需要始终确保它 每次都以相同的方式工作,或者它, 也会导致问题。最后, 方法总是必须在 另一个线程,因为曾经的 验证窗口出现了,它 停止所有其他处理,直到它 消失了。除此之外,它有效。
由此,我能够使用a将FireWatir :: Firefox类子类化 新的Browser类,它支持“credentials =”方法,就像 Celerity ::浏览器。所以,就像使用celerity一样,你可以这样做:
require 'browser'
browser = Browser.new
browser.credentials = 'user:pass'
browser.goto('http://some.basic.auth.url')
这将自动填写Basic Auth对话框并登录 该网站。
我已经在下面发布了我的browser.rb文件的内容(请注意这一点 适用于linux中的ruby + firewatir和jruby + celerity:
ENGINE = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
if ENGINE == 'ruby'
require 'firewatir'
class Browser < FireWatir::Firefox
def initialize(options={})
super(options)
@username = nil
@password = nil
end
def credentials=(string)
username, password = string.split(":")
if username.nil? or password.nil?
raise "Invalid credentials: #{string})"
else
@username = username
@password = password
end
end
def goto(url, wait=3)
if @username.nil? and @password.nil?
return super(url)
else
t = Thread.new { logon(@username, @password, wait) }
result = super(url)
t.join
return result
end
end
private
def logon(username, password, wait)
jssh_command = "
var length = getWindows().length;
var win;
var found = false;
for (var i = 0; i < length; i++) {
win = getWindows()[i];
if(win.document.title == \"Authentication Required\") {
found = true;
break;
}
}
if (found) {
var jsdocument = win.document;
var dialog = jsdocument.getElementsByTagName(\"dialog\")[0];
jsdocument.getElementsByTagName(\"textbox\")[0].value = \"#{username}\";
jsdocument.getElementsByTagName(\"textbox\")[1].value = \"#{password}\";
dialog.getButton(\"accept\").click();
}
\n"
sleep(wait)
$jssh_socket.send(jssh_command,0)
read_socket()
end
end
elsif ENGINE == 'jruby'
require 'celerity'
class Browser < Celerity::Browser; end
else
raise "Ruby ENGINE '#{ENGINE}' not supported."
end
答案 2 :(得分:-1)
注意:使用Ruby中的Capybara + selenium-webdriver,我做了;
require 'capybara'
require 'selenium-webdriver'
profile = Selenium::WebDriver::Firefox::Profile.new
profile['network.http.phishy-userpass-length'] = 255
Capybara::Selenium::Driver.new(:profile => profile, :browser => :firefox)