我正在尝试使用FireWatir (1.6.5)来访问一个使用基本身份验证的站点,但我一直无法找到在Linux中的火狐上工作的解决方案。FireWatir 1.6.5是否支持Linux上的基本身份验证?我已经在网上搜索了两天了,但是在任何地方都找不到关于如何做到这一点的直接答案。
我发现唯一有帮助的线程是这个( http://groups.google.com/group/watir-general/browse_thread/thread/d8ab9a177d282ce4/fc1bf2319fb387d8?lnk=gst&q=basic+authentication#fc1bf2319fb387d8)。
Aedorn Varanis说:“Angrez的fork已经有了解决方案,所以我现在正在使用它。感谢Angrez,它完美地工作了!”,但他没有提到他做了什么让事情正常工作。
最初,我尝试通过使用以下命令绕过身份验证对话框:
browser.goto('http://admin:password@172.20.1.1')
但是,这会生成一个“确认”对话框,该对话框显示:
您即将使用用户名“admin”登录到网站"172.20.1.1“。取消,确定
此对话框阻塞,直到我单击“确定”,goto调用才会返回。
然后我尝试添加:
browser.startClicker("ok") browser.goto('http://admin:password@172.20.1.1')
但这也会生成相同的“确认”对话框。
我使用单元测试/var/ lib/gems/1.8/gems/firewatir-1.6.5/unittests/html/JavascriptClick.html测试了startClicker功能,它工作得很好,这让我认为使用startClicker方法不是处理确认对话框的正确方式。
还有谁找到了让Basic Auth工作的方法,或者如何单击确认对话框上的OK?我已经无计可施了。
发布于 2010-04-06 01:42:15
在Aedorn Varanis的帮助下,我已经在Linux的Firefox上做了一些工作。
Aedorn向我发送了一个"logon“方法,该方法发出一个jssh命令,该命令检查"Authentication Required”对话框,如果存在,则填写用户名/密码并提交对话框。
我已经复制并粘贴了他在下面发给我的内容:
使用如下所示的方法:
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 (user,pass) } @ff.goto("http://some_url.com")睡眠3
如果页面需要一段时间才能加载,则增加等待和睡眠时间。如果您的主进程试图在通过JSSH套接字发送命令的同时运行,它将停止并永远停留在那里直到终止。此外,没有真正的方法来检测身份验证窗口是否出现。这意味着你需要确保它每次都以相同的方式工作,否则也会导致问题。最后,该方法必须始终在另一个线程中,因为一旦出现身份验证窗口,它就会停止所有其他处理,直到它消失。除此之外,它是有效的。
由此,我可以使用一个新的Browser类来继承FireWatir::Firefox类,该类支持"credentials=“方法,就像Celerity::Browser一样。因此,就像使用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发布于 2010-04-01 19:22:09
这可能是一个漫长而丑陋的变通办法,也可能违背watir哲学的简单性,但既然您已经束手无策了……
1) Sahi (http://sahi.co.in/)通过将它们转换成常规网页来处理401认证对话。
2) Sahi的代理需要运行,您将浏览器指向使用Sahi的代理。
3)然后,您可以导航到您的页面,只需使用watir/firewatir将用户名和密码输入到转换后的401身份验证网页中(就像常规表单一样)。
您可能会招致代理的额外负载,但Sahi的行为相当良好,因此您应该能够使其工作。
如果你需要进一步的帮助,你可以在这里或者在Sahi的论坛上发帖。
希望这能有所帮助。-Narayan
发布于 2012-04-17 22:54:46
我与这个问题斗争了很长时间,直到今天。显然,我多次忽略了这个答案,因为它看起来不可信。然而,解决方案在于Firefox的"network.http.phishy-userpass-length“配置文件。如果FireWatir允许你修改你的火狐实例配置文件,那么你可以给"network.http.phishy-userpass-length“一个255的值,这样对话框就会消失。有关更多详细信息,请查看http://kb.mozillazine.org/Network.http.phishy-userpass-length。
注意:在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)https://stackoverflow.com/questions/2556334
复制相似问题