Hi. I encountered a problem when tried to use click_no_wait. I used my own debugging techniques (http://www.itreallymatters.net/post/378669758/debugging-watirs-click-no-wait-method-problems) and got this error message from Ruby: -e:1: unterminated string meets end of file
Anyway, it is strange, because the same code worked on one PC and didn't work on another. System configurations are as following: PC #1, where everything worked as they are: Windows 7 Ultimate 64bit ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] And the PC #2, where it didn't work: Windows 7 Professional 32bit ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] So, the only difference seems to be in 32/64 bit and Professional/Ultimate. So i started investigating and in the end made a patch which fixed it. After that I googled around and saw that there has been already done same patch in the past. It is actually in JIRA: http://jira.openqa.org/browse/WTR-320 The same bug got already mentioned in one of our previous lengthy thread called "Recommended Ruby Version" (http://www.mail-archive.com/[email protected]/msg00298.html), but I didn't know at that time that it is the same problem, because it didn't have the same error message mentioned in it. Anyway, creating that patch helped me to solve my problem and now it's working on both PC-s. Another question is that why is it stated as "Fixed" in JIRA in Watir 1.6.5, when it isn't? Also, in Watir's repo (if that is official repo - http://github.com/bret/watir/blob/master/watir/lib/watir/page-container.rb) there isn't that patch applied either. Is it somehow gone missing? Didn't see anything related to that in git history either... Also, when talking about the method called eval_in_spawned_process in page_container.rb, then it seems that it is only used by click_no_wait and one test, which means that in my opinion we could simplify it to some degree. At least i couldn't think of the reason why it is currently as it is - essentially, why is this load_path_code variable used there at all? Currently the solution is like this: def eval_in_spawned_process(command) command.strip! load_path_code = _code_that_copies_readonly_array($LOAD_PATH, '$LOAD_PATH') ruby_code = "require 'watir/ie'; " # ruby_code = "$HIDE_IE = #{$HIDE_IE};" # This prevents attaching to a window from setting it visible. However modal dialogs cannot be attached to when not visible. ruby_code << "pc = #{attach_command}; " # pc = page container # IDEA: consider changing this to not use instance_eval (it makes the code hard to understand) ruby_code << "pc.instance_eval(#{command.inspect})" exec_string = "start rubyw -e #{(load_path_code + '; ' + ruby_code).inspect}" system(exec_string) end My proposed solution would be like this: def eval_in_spawned_process(command) command.strip! ruby_code = "require 'watir/ie';" ruby_code << "pc = #{attach_command};" # pc = page container ruby_code << "pc.instance_eval(#{command.inspect})" exec_string = "start rubyw -e #{ruby_code.gsub('"','\'').inspect}" system(exec_string) end This is working for me and i won about 1 second while performing the click. Also i don't see a reason why this load path would be copied at all. Maybe someone has the explanation and then it could be as it is? I could only imagine that it is needed when someone performs some other trick in separate process, which includes some 3rd party libraries, but currently it is a overkill it seems. Maybe, just maybe, there should be a require "rubygems" in the commands, because we can't assume that everyone has set a -rubygems as as RUBYOPT. Because this statement is currently missing then this might also be a potential place which causes problems when click_no_wait is used. Just a thought. So like this: def eval_in_spawned_process(command) command.strip! ruby_code = "require 'rubygems';" ruby_code = "require 'watir/ie';" ruby_code << "pc = #{attach_command};" # pc = page container ruby_code << "pc.instance_eval(#{command.inspect})" exec_string = "start rubyw -e #{ruby_code.gsub('"','\'').inspect}" system(exec_string) end Also, when simplifying this method as above, we could also delete other (rather ugly) method (with it's comment), which is used only once: # why won't this work when placed in the module (where it properly belongs) def _code_that_copies_readonly_array(array, name) "temp = Array.new(#{array.inspect}); #{name}.clear; temp.each {|element| #{name} << element}" end What do you guys think about this problem, solutions and refactorings/changes? Jarmo Pertman _______________________________________________ Wtr-development mailing list [email protected] http://rubyforge.org/mailman/listinfo/wtr-development
