Ruby-Capybara 页面加载等待 [在 Ruby-Capybara-Selenium-Cucumber 嵌入式框架中为 Web 自动化设置方法]

问题描述 投票:0回答:2

我必须在使用嵌入式 [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完成。

ruby selenium-webdriver capybara page-load-time
2个回答
1
投票

当使用 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/teamcapybara/capybara#beware-the-xpath--trap


-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
© www.soinside.com 2019 - 2024. All rights reserved.