在 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 发送命令
插座,它将停止并坐在那里
永远直到被杀。还有,没有
真正的方法来检测是否
身份验证窗口出现。那
意味着你需要确保它始终
每次都以相同的方式工作,或者它,
也会导致问题。最后,
方法总是必须在
另一个线程,因为一旦
身份验证窗口出现,它
停止所有其他处理,直到它
消失了。除此之外,它还有效。
由此,我可以将 FireWatir::Firefox 类子类化为
新的 Browser 类,它支持 "credentials=" 方法,就像
Celerity::Browser 可以。所以,就像使用 celerity 一样,你可以这样做:
require 'browser'
browser = Browser.new
browser.credentials = 'user:pass'
browser.goto('http://some.basic.auth.url')
这将自动填写基本身份验证对话框并让您登录
网站。
我已经在下面发布了我的 browser.rb 文件的内容(注意这一点
适用于 ruby+firewatir 和 jruby+celerity 在 linux):
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