ruby内嵌表达式
可以用#{}内嵌表达式,如:
- ruby> var = “ abc ”
- “ abc ”
- ruby> “1234#{var}5678″
- “1234 abc 5678″
可以用#{}内嵌表达式,如:
今天是一个高兴的日子,我终于成功地利用AutoIt关闭IE弹窗了。
利用Watir进行网页测试已经有2年多了,但始终在处理IE弹窗上卡壳,网上有不少介绍和例子可供借鉴,但以前均未能测试成功。
先将代码列出:
require ‘watir’
require ‘win32ole’
require ‘watir/windowhelper’
………
………
ie33.link(:id, “something”).click_no_wait
sleep 3 #时间长短可能影响能否关闭弹窗
#sleep 2
puts “before autoit”
autoit = WIN32OLE.new(‘AutoItX3.Control’)
puts “before loop do”
loop do
puts “in loop”
#ret = autoit.WinWaitActive(“Windows Internet Explorer”, “”,9)
#ret = autoit.WinWaitActive(“来自网页的信息”, “”,9)
ret = autoit.WinWaitActive(“Microsoft Internet Explorer”, “”,9)
puts “after ret”
puts(ret)
if (ret==1)
autoit.Send(“{Enter}”)
exit
end
sleep 3
end
以前不成功的原因,主要是测试用电脑的环境不一样,今天尝试以上代码时,刚开始也不成功,ret始终等于0,偶然用鼠标碰了一下IE窗口,ret变为1。这才发现ie33.link(:id, “something”).click_no_wait语句之后的sleep时间长短很关键,不同的电脑以及网络速度不同,sleep时间不匹配的话,以上代码不能正常运行。
比较疑惑的是,以下代码不行:
require ‘watir’
require ‘win32ole’
require ‘watir/windowhelper’
………
………
Thread.new{
puts “before autoit”
autoit = WIN32OLE.new(‘AutoItX3.Control’)
puts “before loop do”
loop do
puts “in loop”
#ret = autoit.WinWaitActive(“Windows Internet Explorer”, “”,9)
#ret = autoit.WinWaitActive(“来自网页的信息”, “”,9)
ret = autoit.WinWaitActive(“Microsoft Internet Explorer”, “”,9)
puts “after ret”
puts(ret)
if (ret==1)
autoit.Send(“{Enter}”)
exit
end
sleep 3
end
}
ie33.link(:id, “something”).click_no_wait
在将ie33.link(:id, “something”).click_no_wait修改为ie33.link(:id, “something”).click之后,以上代码运行成功。
第一次往往是最难的,以后通过watir + nobogiri +mechanize + autoit, 基本上可以解决大部分网页测试的问题了。
watir中获得IE进程号的语句:
ie33 = Watir::IE.start(“http://www.google.com“)
pid_number = Watir::IE::Process.process_id_from_hwnd(ie33.hwnd)
本文原创于: http://www.sdgz.cn
1. eLance
http://www.elance.com/
2. Guru
http://www.guru.com/
3. RentACoder
http://www.rentacoder.com/
4. GetAFreelancer
http://www.getafreelancer.com/
5. ScriptLance
http://www.scriptlance.com/
有时候需要统计网页中或者网页某个区域中的链接数量,刚开始我尝试以下语句,但不成功:
ie.links(:id, /bra bra/).length
后来发现以下语句可行:
ie.div(:id, “searchList”).links
之后发现如下更好的语句:
links_searchlist = ie101.links.find_all { |link| link.class_name == ‘permalink’ }
puts “the links in the searchlist:”
puts links_searchlist.length
searchlistlinks = ie102.links.find_all { |link| link.id =~ /hitURL/ }
links_searchlist = searchlistlinks.length
puts links_searchlist
searchlistlinks = ie33.links.find_all { |link| link.href =~ /something/ }
类似的语句不行:searchlistlinks = ie33.links.find_all { |link| link.url =~ /something/ }
最近发现,如果链接数量比较多,以上语句耗时太长,通过google和百度,找到了更高效的语句:
links = ie51.div(:id, ‘threadlist’).html.scan(/something/).count
puts links
想了很多办法,包括更改.rb文件和firefox浏览器的编码,都不能用firewatir 1.6.5往网页上输入中文字符,测试的代码如下:
require ‘rubygems’
require ‘firewatir’
ff = FireWatir::Firefox.new
ff.goto “http://www.google.com”
sleep 1
ff.text_field(:name, ‘q’).set(‘电’)
我还利用了以下语句,同样没有效果:
g_word = ‘电’
puts g_word
g_word_gb = Iconv.iconv(“GB2312//IGNORE”,”UTF-8//IGNORE”,g_word)
puts g_word_gb
sleep 1
ff.text_field(:name, ‘q’).set(g_word_gb[0])
或者:
g_word = ‘电’
puts g_word
g_word_utf = Iconv.iconv(“UTF-8//IGNORE”,”GB2312//IGNORE”,g_word)
puts g_word_utf
sleep 1
ff.text_field(:name, ‘q’).set(g_word_utf[0])
含中文字符的url是一些乱码,如中文”个”,在url中表示为”%b8%f6″。有时需要进行url解码和编码,两个函数如下:
def URLDecode(str)
str.gsub!(/%[a-fA-F0-9]{2}/) { |x| x = x[1..2].hex.chr }
end
def URLEncode(str)
str.gsub!(/[^\w$&\-+.,\/:;=?@]/) { |x| x = format(“%%%x“, x[0]) }
end
有的时候需要给ruby程序以及ruby待操作的文件以完整的路径,举例说明吧:
在g:\ding\anpc\163_anpc.rb程序中有如下代码:
3.times {
load ‘..\anpc\data_163.rb’
load ‘..\bin\bin_163.rb’
}
如果在g:\ding\anpc\ 下执行163_anpc.rb, 程序可以正常运行,但如果在别的路径,比如c:\,执行g:\ding\anpc\163_anpc.rb,程序就会报错,说找不到data_163.rb和bin_163.rb。
解决问题的方法是给ruby程序以完整的路径,如下所示:
3.times {
load File.join(File.dirname(__FILE__), ‘data_163.rb’)
load File.join(File.dirname(__FILE__), ‘../bin/bin_163.rb’)
}
类似的例子:
在g:\ding\anpc\data_163.rb程序中有如下代码:
#初始化user
users = []
File.open(‘user_163_anpc.txt’) do |f|
f.each_line do |line|
words = line.split(‘ ‘)
users << {:user => words[0], :password => words[1]}
end
end
该程序在g:\ding\anpc\ 下执行data_163.rb, 文件操作正常,但如果在别的路径,比如c:\,执行g:\ding\anpc\data_163.rb,程序就会报错,说找不到文件user_163_anpc.txt。
解决问题的方法是给待操作的文件以完整的路径,如下所示:
#初始化user
users = []
users_filename = File.join(File.dirname(__FILE__), ‘user_sina_anpc.txt’)
File.open(users_filename) do |f|
f.each_line do |line|
words = line.split(‘ ‘)
users << {:user => words[0], :password => words[1]}
end
end
本文原创于:http://www.sdgz.cn
最近忽然感觉到在watir程序的开头,应包含require ‘rubygems’,否则某些情况下会发生比较奇怪的现象。
本文原创于:http://www.sdgz.cn
最新评论