- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Rails 中创建一些 JavaScript 功能时,我使用了一些丑陋的 Capybara 规范来帮助我确保一切正常。其中一个规范如下所示:
it 'creates a report document', js: true do
visit new_project_report_document_path @project
expect(page).to have_active_navigation_items 'Projects'
expect(page).to have_breadcrumbs 'A4AA 2.0', 'Projects', 'Project test name', 'Reports', 'Create'
expect(page).to have_headline 'Create Report'
expect {
select 'Template 1', from: 'report_report_template_id'
}.to change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}']", visible: true }.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_name[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_description[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_intro[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_content[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_outro[disabled]", visible: false}.from(true)
expect(page).to have_css "[data-template-inputs-id='#{@report_template_1.id}'] #report_name", text: @report_template_1.name
expect(page).to have_css "[data-template-inputs-id='#{@report_template_1.id}'] #report_description", text: ''
expect(page).to have_css "[data-template-inputs-id='#{@report_template_1.id}'] #report_intro", text: @report_template_1.intro
expect(page).to have_css "[data-template-inputs-id='#{@report_template_1.id}'] #report_content", text: @report_template_1.content
expect(page).to have_css "[data-template-inputs-id='#{@report_template_1.id}'] #report_outro", text: @report_template_1.outro
expect {
select 'Template 2', from: 'report_report_template_id'
}.to change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}']", visible: true }.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_name[disabled]", visible: false}.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_description[disabled]", visible: false}.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_intro[disabled]", visible: false}.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_content[disabled]", visible: false}.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_1.id}'] #report_outro[disabled]", visible: false}.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_2.id}']", visible: true }.from(false)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_2.id}'] #report_name[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_2.id}'] #report_description[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_2.id}'] #report_intro[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_2.id}'] #report_content[disabled]", visible: false}.from(true)
.and change { page.has_css? "[data-template-inputs-id='#{@report_template_2.id}'] #report_outro[disabled]", visible: false}.from(true)
expect(page).to have_css "[data-template-inputs-id='#{@report_template_2.id}'] #report_name", text: @report_template_2.name
expect(page).to have_css "[data-template-inputs-id='#{@report_template_2.id}'] #report_description", text: ''
expect(page).to have_css "[data-template-inputs-id='#{@report_template_2.id}'] #report_intro", text: @report_template_2.intro
expect(page).to have_css "[data-template-inputs-id='#{@report_template_2.id}'] #report_content", text: @report_template_2.content
expect(page).to have_css "[data-template-inputs-id='#{@report_template_2.id}'] #report_outro", text: @report_template_2.outro
fill_in 'report_name', with: 'newname'
fill_in 'report_description', with: 'newdescription'
fill_in 'report_intro', with: 'newintro'
fill_in 'report_content', with: 'newcontent'
fill_in 'report_outro', with: 'newoutro'
click_button 'Create Report'
expect(page).to have_flash 'Report was successfully created.'
end
我知道这是一个丑陋的规范,但我注意到它需要花费大量时间:大约 40 秒!
Finished in 41.86 seconds (files took 0.44731 seconds to load)
这是另一个激活了 JavaScript 的规范。虽然它小得多(并且只加载一个整页),但我认为它所需的时间比上面的要少得多:
it 'allows to remove an existing finding', js: true, focus: true do
visit edit_project_boilerplate_copy_path(@boilerplate_copy.project, @boilerplate_copy)
click_link 'Remove finding'
expect {
click_button 'Update Boilerplate'
} .to change { Finding.count }.by -1
end
大约需要 6-7 秒:
Finished in 6.62 seconds (files took 0.52104 seconds to load)
所以我想知道为什么第一个需要这么多时间。我的完整规范套件大约有 400 个规范,大约需要一分钟,所以通过添加新规范,它会增加到近 2 分钟!这是 Not Acceptable 。
那么:我的 JS 规范如何改进?这与许多 visible: false
语句有关吗?或者许多 and Change { ... }
的东西?也许两者都在互动?
当删除所有包含 visible: false
的行时,速度会更快:
Finished in 6.39 seconds (files took 0.41315 seconds to load)
我在 OSX El Capitan 上使用 capybara (2.5.0)、rspec (3.3.0)、rails (4.2.1) 和 poltergeist (1.7.0) 以及 phantomjs (1.9.8)。
最佳答案
你的测试之所以如此缓慢,是因为你遇到了 capybara 的等待行为。 #has_css?/have_css
将等待 Capybara.default_max_wait_time 秒,让匹配的元素出现在页面上,如果没有出现,则返回 false。当您期望某个元素不在您想要使用的页面上时,请使用 #has_no_css?/have_no_css (或 not_to #has_css?/have_css 因为它们最终是同一件事),因为一旦找不到该元素,它将立即返回.
has_css?(....) #will wait until element appears or default_max_wait_time
has_no_css?(....) #will wait until element is gone or default_max_wait_time
基本上就您的情况而言,您不想将 change
匹配器与 has_css 一起使用?因为它不允许您在操作的每一侧使用尽快匹配的方法。如果您确实想保留 change
匹配器,一个潜在的选择是将一个小的等待值传递给 has_css? wait: 0.5
或其他可以减少该项目的最大等待时间的值,但可能需要进行调整以允许页面上发生的任何操作实际完成
关于javascript - capybara 和JavaScript : checking for visibility requires huge amounts of time! 如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272416/
Mysql表 Name | Amount ------------ name1 | 150 name1 | 90 name2 | 100 name2 | 110 name3 | 10 结
由于 mySQL 的语法不允许此语句(WHERE 部分中不能使用计数元素): Illegal syntax: SELECT COUNT(x) AS amount ... WHERE amount >
我在我的 .Net MVC 4 Razor 网站上使用 PayPal 的 REST API。 在创建付款时,我通过 fiddler 跟踪了以下请求和响应: 任何人都可以解释导致错误的原因吗?交易总金额
需要从贷方和借方帐号相同的借方总额中减去贷方总额。如果一个值只存在于借记账号,没有什么可以减去的,只需要得到这个值。 名为 18_7_ChartOfAccounts 的表如下所示: ID | Acco
关于这个错误的帖子有很多,但都不适用于我。我真的不明白为什么金额不匹配。我有匹配 AMT0 * QTY0 的 ITEMAMT。而AMT匹配ITEMAMT + SHIPPINGAMT。我一遍又一遍地检查
我正在使用 paypal 快速结帐 API,但在设置数量时遇到问题。以下是我的 URI 参数: $params = array( 'METHOD' => 'SetExpressCheckout'
假设我有下一个实体 @Entity @Table(name = "account") public class Account { @Id private long id; private long
SO 和其他论坛上有很多关于此错误的内容,但我一直无法找到有帮助的答案。 当我提交以下不含税金额的简化请求时,它可以正常工作,但一旦添加了税,就会发生错误。这是代码: pdItem[0] = new
我在我的网站上使用 paypal 选项。我在 paypal 中使用 expresscheckout。 我收到错误 10413:购物车商品总金额与订单金额不符。 此错误仅在商品数量大于 1 时发生。如果
这是 MySQL 表 Amount | DebitAccount | CreditAccount | TransactionPartnerName --------------------------
我一直在尝试查询NCBI blast website使用 Android 和 BioJava .我将 Eclipse 与 Android 模拟器一起使用。当我将代码作为 Android 应用程序运行时
这是我的表格结构。 id veh_id user_id amount ... 我还有其他表来关联 user_id 和 veh_id。 我想知道用户在每个 veh_id 上输入了多少次金额,以及有多少次
我正在做一个项目来转录讲座视频。我们目前只是使用人工进行转录,因为我们认为转录比编辑 ASR 更容易,尤其是对于技术主题(不是我的问题的重点,尽管我希望对此有任何意见)。根据我们的经验,我们发现在转录
我是 java 编程的初学者,并且在弄清楚如何限制代码中的金额时遇到问题。 我的代码有一个问题,该代码由 if-else if 语句组成,这更多的是如何限制奖金最高金额的问题。我希望我的奖金最高金额为
我想格式化一个金额:所需的格式是:#.##0,00 例如:299.552.698,05 或 299.552.698,00 当我尝试使用 (new DecimalFormat("#.##0,00")
我想执行简单的图像分析,确定图像的哪一部分对应于特定的“控制颜色范围”。我已将图像简化为包含 RGB 值的 2D 像素图,但现在我一直在尝试确定某个像素中包含多少红色(例如红色)。 我对颜色知之甚少,
我正在尝试制作一个 iOS 应用程序来计算年化收入和 401(k) 供款。我不知道如何编写函数代码,因此尽管员工投入了收入的百分比,但它将 401(k) 捐款限制在 18500。我知道这是非常基础的,
我希望我的用户在我的网站上插入一个“金额”进行捐赠,当他们点击“捐赠”按钮时,它会在新选项卡中打开 PayPal 网站,其中已经从我的网站填写了金额。 捐赠有效,只是没有在新的 PayPal 选项卡上
我正在为一个非营利客户开发一个网站,其中包含一个自定义捐赠表格。该表格包括供用户选择预定义捐赠金额或输入他们自己的金额的选项,然后单击“捐赠”,将他们带到 PayPal。通过我的 Sandbox 帐户
我正在尝试获取一个对象名称数组,这些对象的 options.amount 都为零。谢谢你的时间。这是我尝试过的: let variants = [ {
我是一名优秀的程序员,十分优秀!