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