Ruby-Capybara Page load Wait [在 Ruby-Capybara-Selenium-Cucumber 嵌入式框架中设置一个方法用于 web 自动化]

Ruby-Capybara Page load Wait [ To set up a method in Ruby-Capybara-Selenium-Cucumber embeded framework for a web Automation]

我必须在使用嵌入式[Ruby-capybara-selenium 创建的自动化框架中计算每次导航的网页渲染时间 -黄瓜]。 一些网页 Ajax 已开发。

#Xpath
SIGNIN_BTN = "//div/button[contains(.,'Sign In')]"    
VERIFY_BTN = "//div/button[contains(.,'NEXTBUTTON')]"

t1 = Time.now    
      visit "http://google.com"    
t2 = Time.now   
pageloadtime1 = t2-t1  
puts pageloadtime1 

t3 = Time.now  
find(:xpath, SIGNIN_BTN).click  
t4 = Time.now  
pageloadtime2 = t4-t3
puts pageloadtime2 

t5 = Time.now   
find(:xpath, VERIFY_BTN ).click  
t6 = Time.now  
pageloadtime3 = t6-t5
puts pageloadtime3

但按照逻辑,它没有给出完整的页面呈现时间,
而不是立即单击,时间在
之前作为输出给出 page-rendering/DOM已完成。

使用 Capybara 时,无法保证访问 returns 时页面已完全加载(无论那意味着什么),也无法保证通过单击元素触发的任何操作已完成(甚至开始)当它 returns。这是因为除了 "browser" 告诉它在页面上可见的内容之外,Capybara 对页面状态一无所知。仅使用 Capybara,您可以为计时做的最好的事情是您告诉浏览器做某事与元素(预计在 "loaded" 出现在页面上的时间)之间的时间。在你的例子中,这意味着像这样

SIGNIN_BTN = ".//div/button[contains(.,'Sign In')]"    
VERIFY_BTN = ".//div/button[contains(.,'NEXTBUTTON')]"

t1 = Time.now    
visit "http://google.com"    
signin_btn = find(:xpath, SIGNIN_BTN) # wait until signin button is visible on page
t2 = Time.now   
pageloadtime1 = t2-t1  
puts pageloadtime1 

t3 = Time.now  
signin_btn.click 
verify_btn = find(:xpath, VERIFY_BTN ) # wait until the verify button is visible on page
t4 = Time.now  
pageloadtime2 = t4-t3
puts pageloadtime2 

t5 = Time.now   
verify_btn.click
something = find(:xpath, './/xpath of something visible on page when action has completed')  
t6 = Time.now  
pageloadtime3 = t6-t5
puts pageloadtime3

注意,这些测量都将包括一些开销,因为尝试查找元素时的等待行为有开销,并且每次尝试之间有 50 毫秒的延迟。还要注意 SIGNIN_BTN 和 VERIFY_BTN xpaths 现在以 .// 开头 - 你应该习惯以 .// 而不是 // 开始所有与 Capybara 一起使用的 xpaths 除非你确实需要 // 并理解其中的区别(它破坏了页面上的范围)- https://github.com/teamcapybara/capybara#beware-the-xpath--trap

这对我有用。

使用 Ruby 和 Jscript 进行计算 - document.readyState,创建一个通用方法并调用它。

SIGNIN_BTN = "//div/button[contains(.,'Sign In')]" 
NEXT_BTN = "//div/button[contains(.,'NEXTBUTTON')]"

visit "https://gmail.com/"  
timewait = pagetime_time  
puts "LAUNCH GMAIL | PAGELOAD TIME :#{timewait}"  

find(:xpath, SIGNIN_BTN).click  
timewait = pagetime_time  
puts "SIGN IN GMAIL | PAGELOAD TIME :#{timewait}"  

find(:xpath, NEXT_BTN ).click  
timewait = pagetime_time  
puts "NEXT GMAIL | PAGELOAD TIME :#{timewait}"  

def pagetime_time  
  time1 = Time.now  
  timeloop = 0  
  while timeloop < 500  
    if (Capybara.current_session.driver.execute_script('var browserState = document.readyState; return browserState;') == 'complete')  
      time2 = Time.now  
      break  
    end  
    timeloop + 1  
  end  
  timeWait = (time2 - time1) * 1000  
  return timeWait  
end