@@ -53,8 +53,8 @@ def define_individual_job(label, settings, width)
5353 compare_file_name = meta . file_names ( width , label , meta . compare_label )
5454
5555 jobs = [ ]
56- jobs << [ label , settings . path , prepare_widths_for_cli ( width ) , settings . base_url , base_file_name , settings . selector , wraith . before_capture , settings . before_capture ]
57- jobs << [ label , settings . path , prepare_widths_for_cli ( width ) , settings . compare_url , compare_file_name , settings . selector , wraith . before_capture , settings . before_capture ] unless settings . compare_url . nil?
56+ jobs << [ label , settings . path , prepare_widths_for_cli ( width ) , settings . base_url , base_file_name , settings . selector , wraith . before_capture , settings . before_capture , 'invalid1.jpg' ]
57+ jobs << [ label , settings . path , prepare_widths_for_cli ( width ) , settings . compare_url , compare_file_name , settings . selector , wraith . before_capture , settings . before_capture , 'invalid2.jpg' ] unless settings . compare_url . nil?
5858
5959 jobs
6060 end
@@ -76,7 +76,7 @@ def run_command(command)
7676 end
7777
7878 def parallel_task ( jobs )
79- Parallel . each ( jobs , :in_threads => wraith . save_image_threads ) do |_label , _path , width , url , filename , selector , global_before_capture , path_before_capture |
79+ Parallel . each ( jobs , :in_threads => wraith . threads ) do |_label , _path , width , url , filename , selector , global_before_capture , path_before_capture |
8080 begin
8181 if meta . engine == "chrome"
8282 capture_image_selenium ( width , url , filename , selector , global_before_capture , path_before_capture )
@@ -85,8 +85,8 @@ def parallel_task(jobs)
8585 attempt_image_capture ( command , filename )
8686 end
8787 rescue => e
88- logger . error e
89- create_invalid_image ( filename , width )
88+ logger . error " #{ e } \n URL = #{ url } "
89+ create_invalid_image ( filename , width , invalid_image_name )
9090 end
9191 end
9292 end
@@ -96,12 +96,16 @@ def get_driver
9696 case meta . engine
9797 when "chrome"
9898 options = Selenium ::WebDriver ::Chrome ::Options . new
99- options . add_argument ( '--disable-gpu' )
100- options . add_argument ( '--headless' )
101- options . add_argument ( '--device-scale-factor=1' ) # have to change cropping for 2x. also this is faster
102- options . add_argument ( '--force-device-scale-factor' )
103- options . add_argument ( "--window-size=1200,1500" ) # resize later so we can reuse drivers
104- options . add_argument ( "--hide-scrollbars" ) # hide scrollbars from screenshots
99+ [
100+ 'disable-gpu' ,
101+ 'headless' ,
102+ 'no-sandbox' ,
103+ 'device-scale-factor=1' ,
104+ 'force-device-scale-factor' ,
105+ 'window-size=1200,1500' ,
106+ 'hide-scrollbars' ,
107+ 'ignore-certificate-errors'
108+ ] . each { |arg | options . add_argument ( "--#{ arg } " ) }
105109 Selenium ::WebDriver . for :chrome , options : options
106110 end
107111 end
@@ -111,7 +115,7 @@ def resize_to_fit_page driver
111115 width = driver . execute_script ( "return Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);" )
112116 height = driver . execute_script ( "return Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);" )
113117 driver . manage . window . resize_to ( width , height )
114- end
118+ end
115119
116120 # crop an image around the coordinates of an element
117121 def crop_selector driver , selector , image_location
@@ -123,16 +127,25 @@ def crop_selector driver, selector, image_location
123127
124128 def capture_image_selenium ( screen_sizes , url , file_name , selector , global_before_capture , path_before_capture )
125129 driver = get_driver
130+ driver . manage . timeouts . implicit_wait = 10 ;
126131 screen_sizes . to_s . split ( "," ) . each do |screen_size |
127- width , height = screen_size . split ( "x" )
128- new_file_name = file_name . sub ( 'MULTI' , screen_size )
129- driver . manage . window . resize_to ( width , height || 1500 )
130- driver . navigate . to url
131- driver . execute_async_script ( File . read ( global_before_capture ) ) if global_before_capture
132- driver . execute_async_script ( File . read ( path_before_capture ) ) if path_before_capture
133- resize_to_fit_page ( driver ) unless height
134- driver . save_screenshot ( new_file_name )
135- crop_selector ( driver , selector , new_file_name ) if selector && selector . length > 0
132+ for attempt in 1 ..3 do
133+ begin
134+ width , height = screen_size . split ( "x" )
135+ new_file_name = file_name . sub ( 'MULTI' , screen_size )
136+ driver . manage . window . resize_to ( width , height || 1500 )
137+ driver . navigate . to url
138+ driver . manage . timeouts . implicit_wait = wraith . settle
139+ driver . execute_script ( File . read ( global_before_capture ) ) if global_before_capture
140+ driver . execute_script ( File . read ( path_before_capture ) ) if path_before_capture
141+ resize_to_fit_page ( driver ) unless height
142+ driver . save_screenshot ( new_file_name )
143+ crop_selector ( driver , selector , new_file_name ) if selector && selector . length > 0
144+ break
145+ rescue Net ::ReadTimeout => e
146+ logger . error "Got #{ e } on attempt #{ attempt } at screen size #{ screensize } . URL = #{ url } "
147+ end
148+ end
136149 end
137150 driver . quit
138151 end
@@ -164,9 +177,9 @@ def image_was_created(filename)
164177 wraith . resize or File . exist? filename
165178 end
166179
167- def create_invalid_image ( filename , width )
180+ def create_invalid_image ( filename , width , invalid_image_name )
168181 logger . warn "Using fallback image instead"
169- invalid = File . expand_path ( "../../assets/invalid.jpg " , File . dirname ( __FILE__ ) )
182+ invalid = File . expand_path ( "../../assets/#{ invalid_image_name } " , File . dirname ( __FILE__ ) )
170183 FileUtils . cp invalid , filename
171184
172185 set_image_width ( filename , width )
0 commit comments