【问题标题】:Ruby-Capybara Page load Wait [ To set up a method in Ruby-Capybara-Selenium-Cucumber embeded framework for a web Automation]Ruby-Capybara 页面加载等待 [在 Ruby-Capybara-Selenium-Cucumber 嵌入式框架中为 Web 自动化设置方法]
【发布时间】:2018-06-11 21:14:53
【问题描述】:

我必须在使用嵌入 [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 capybara page-load-time webpage-rendering


    【解决方案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/teamcapybara/capybara#beware-the-xpath--trap

    【讨论】:

    • 谢谢,但是 Jscript - document.readystate with ruby​​ 对我来说效果很好
    【解决方案2】:

    这对我有用。

    用 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
    

    【讨论】:

    • 如果它对你有用 - 很好,只要你意识到你依赖于完全不受保证的行为,这些行为可能会在任何相关 gem 的任何次要版本中发生变化,并且还取决于特定于驱动程序没有明显原因的方法。
    • @ThomasWalpole 我可以知道为什么这是完全无保证的行为吗?它总是可以正常工作,我可以在这里看到的唯一问题,如果程序在单击您检查此 Javascript 的位置后立即移至下一行,它会告诉您页面加载完成但几毫秒后页面开始加载,因此它可能会结束错误,但克服的方法是等到元素过时,然后使用他在评论中编写的上述 Javascript 检查页面是否完全加载..在下一条评论中继续....
    • @ThomasWalpole 如果您使用旧版 Firefox 驱动程序,此页面加载完全没有问题,如果您使用 geckodriver,那么页面加载也不是问题,因为它们似乎已在上一个版本中修复,但我明白了它仍然不可靠,因为它甚至在完全加载之前就释放了控制。这是我们无法从程序中检查出来的东西,所以我们必须依赖JS,别无他法。这是我们必须完全依赖驱动程序的唯一地方。其他的事情,比如等到找到一个我们可以像 WATIR 一样通过本地语言绑定来管理它的元素。
    • @Rajagopalan 非常感谢。看完你们这些cmets我有了一个清晰的认识。
    猜你喜欢
    • 2017-05-29
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多