-1

我必须在使用嵌入 [ Ruby-capybara-selenium-cucumber ]创建的自动化框架中计算每次导航的网页渲染时间。一些网页是 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

但按照逻辑,它并没有给出完整的页面渲染时间,而是在页面渲染/DOM
完成 之前立即将时间作为输出给出。

4

2 回答 2

-1

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

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 xpath 现在以.//- 您应该习惯于启动与 Capybara 一起使用的所有 xpath,.//而不是//除非您真的需要//并理解差异(它破坏了页面上的范围) - https://github.com/团队水豚/水豚#beware-the-xpath--trap

于 2018-05-17T16:07:05.783 回答
-1

这对我有用。

用 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
于 2018-06-11T13:14:53.780 回答