diff --git a/packages/driver/test/cypress/integration/commands/actions/type_spec.coffee b/packages/driver/test/cypress/integration/commands/actions/type_spec.coffee
index c1ae3d1f55..dbb15ed896 100644
--- a/packages/driver/test/cypress/integration/commands/actions/type_spec.coffee
+++ b/packages/driver/test/cypress/integration/commands/actions/type_spec.coffee
@@ -4,6 +4,12 @@ Keyboard = Cypress.Keyboard
Promise = Cypress.Promise
$selection = require("../../../../../src/dom/selection")
+## trim new lines at the end of innerText
+## due to changing browser versions implementing
+## this differently
+trimInnerText = ($el) ->
+ _.trimEnd($el.get(0).innerText, "\n")
+
describe "src/cy/commands/actions/type", ->
before ->
cy
@@ -11,6 +17,31 @@ describe "src/cy/commands/actions/type", ->
.then (win) ->
@body = win.document.body.outerHTML
+ el = cy.$$('[contenteditable]:first').get(0)
+
+ innerHtml = el.innerHTML
+
+ ## by default... the last new line by itself
+ ## will only ever count as a single new line...
+ ## but new lines above it will count as 2 new lines...
+ ## so by adding "3" new lines, the last counts as 1
+ ## and the first 2 count as 2...
+ el.innerHTML = '
'.repeat(3)
+
+ ## browsers changed their implementation
+ ## of the number of newlines that
+ ## create. newer versions of chrome set 2 new lines
+ ## per set - whereas older ones create only 1 new line.
+ ## so we grab the current sets for the assertion later
+ ## so this test is browser version agnostic
+ newLines = el.innerText
+
+ ## disregard the last new line, and divide by 2...
+ ## this tells us how many multiples of new lines
+ ## the browser inserts for new lines other than
+ ## the last new line
+ @multiplierNumNewLines = (newLines.length - 1) / 2
+
beforeEach ->
doc = cy.state("document")
@@ -1038,7 +1069,7 @@ describe "src/cy/commands/actions/type", ->
cy.$$('[contenteditable]:first').get(0).innerHTML = 'foo
'
cy.get("[contenteditable]:first")
.type("bar").then ($div) ->
- expect($div.get(0).innerText).to.eql("foobar\n")
+ expect(trimInnerText($div)).to.eql("foobar")
expect($div.get(0).textContent).to.eql("foobar")
expect($div.get(0).innerHTML).to.eql("foobar
")
@@ -1046,7 +1077,7 @@ describe "src/cy/commands/actions/type", ->
cy.$$('[contenteditable]:first').get(0).innerHTML = 'foo
'
cy.get("[contenteditable]:first")
.type("bar").then ($div) ->
- expect($div.get(0).innerText).to.eql("foobar\n\n")
+ expect(trimInnerText($div)).to.eql("foobar")
expect($div.get(0).textContent).to.eql("foobar")
expect($div.get(0).innerHTML).to.eql("foobar
")
@@ -1054,13 +1085,13 @@ describe "src/cy/commands/actions/type", ->
cy.$$('[contenteditable]:first').get(0).innerHTML = 'bar
'
cy.get("[contenteditable]:first")
.type("{selectall}{leftarrow}foo").then ($div) ->
- expect($div.get(0).innerText).to.eql("foobar\n")
+ expect(trimInnerText($div)).to.eql("foobar")
it "collapses selection to end on {rightarrow}", ->
cy.$$('[contenteditable]:first').get(0).innerHTML = 'bar
'
cy.get("[contenteditable]:first")
.type("{selectall}{leftarrow}foo{selectall}{rightarrow}baz").then ($div) ->
- expect($div.get(0).innerText).to.eql("foobarbaz\n")
+ expect(trimInnerText($div)).to.eql("foobarbaz")
it "can remove a placeholder
", ->
cy.$$('[contenteditable]:first').get(0).innerHTML = '
'
@@ -1451,7 +1482,7 @@ describe "src/cy/commands/actions/type", ->
cy.get("[contenteditable]:first")
.type("{home}11{uparrow}{home}22{uparrow}{home}33").then ($div) ->
- expect($div.get(0).innerText).to.eql("33foo\n22bar\n11baz\n")
+ expect(trimInnerText($div)).to.eql("33foo\n22bar\n11baz")
context "{end}", ->
it "sets which and keyCode to 35 and does not fire keypress events", (done) ->
@@ -1501,7 +1532,7 @@ describe "src/cy/commands/actions/type", ->
cy.get("[contenteditable]:first")
.type("{end}11{uparrow}{end}22{uparrow}{end}33").then ($div) ->
- expect($div.get(0).innerText).to.eql("foo33\nbar22\nbaz11\n")
+ expect(trimInnerText($div)).to.eql("foo33\nbar22\nbaz11")
context "{uparrow}", ->
beforeEach ->
@@ -1540,7 +1571,7 @@ describe "src/cy/commands/actions/type", ->
cy.get("[contenteditable]:first")
.type("{leftarrow}{leftarrow}{uparrow}11{uparrow}22{downarrow}{downarrow}33").then ($div) ->
- expect($div.get(0).innerText).to.eql("foo22\nb11ar\nbaz33\n")
+ expect(trimInnerText($div)).to.eql("foo22\nb11ar\nbaz33")
it "uparrow ignores current selection", ->
ce = cy.$$('[contenteditable]:first').get(0)
@@ -1556,7 +1587,7 @@ describe "src/cy/commands/actions/type", ->
cy.get("[contenteditable]:first")
.type("{uparrow}11").then ($div) ->
- expect($div.get(0).innerText).to.eql("11foo\nbar\nbaz\n")
+ expect(trimInnerText($div)).to.eql("11foo\nbar\nbaz")
it "up and down arrow on textarea", ->
cy.$$('textarea:first').get(0).value = 'foo\nbar\nbaz'
@@ -1570,7 +1601,6 @@ describe "src/cy/commands/actions/type", ->
.type('{uparrow}{uparrow}')
.should('have.value', '14')
-
context "{downarrow}", ->
beforeEach ->
cy.$$("#comments").val("foo\nbar\nbaz")
@@ -1626,7 +1656,7 @@ describe "src/cy/commands/actions/type", ->
cy.get("[contenteditable]:first")
.type("{downarrow}22").then ($div) ->
- expect($div.get(0).innerText).to.eql("foo\n22bar\nbaz\n")
+ expect(trimInnerText($div)).to.eql("foo\n22bar\nbaz")
context "{selectall}{del}", ->
it "can select all the text and delete", ->
@@ -1688,14 +1718,16 @@ describe "src/cy/commands/actions/type", ->
it "inserts new line into [contenteditable] ", ->
cy.get("#input-types [contenteditable]:first").invoke("text", "foo")
.type("bar{enter}baz{enter}{enter}{enter}quux").then ($div) ->
- expect($div.get(0).innerText).to.eql("foobar\nbaz\n\n\nquux\n")
+ conditionalNewLines = "\n\n".repeat(@multiplierNumNewLines)
+
+ expect(trimInnerText($div)).to.eql("foobar\nbaz#{conditionalNewLines}\nquux")
expect($div.get(0).textContent).to.eql("foobarbazquux")
expect($div.get(0).innerHTML).to.eql("foobarbaz
quux
")
it "inserts new line into [contenteditable] from midline", ->
cy.get("#input-types [contenteditable]:first").invoke("text", "foo")
.type("bar{leftarrow}{enter}baz{leftarrow}{enter}quux").then ($div) ->
- expect($div.get(0).innerText).to.eql("fooba\nba\nquuxzr\n")
+ expect(trimInnerText($div)).to.eql("fooba\nba\nquuxzr")
expect($div.get(0).textContent).to.eql("foobabaquuxzr")
expect($div.get(0).innerHTML).to.eql("foobaba
quuxzr
")
@@ -2312,7 +2344,6 @@ describe "src/cy/commands/actions/type", ->
.then ->
expect(changed).to.eql 0
-
describe "caret position", ->
it "respects being formatted by input event handlers"
@@ -2380,32 +2411,35 @@ describe "src/cy/commands/actions/type", ->
el.innerHTML = 'start'+
'middle
'+
'end
'
+
cy.get('[contenteditable]:first')
## move cursor to beginning of div
.type('{selectall}{leftarrow}')
- .type('{rightarrow}'.repeat(14)+'[_I_]').then ->
- expect(cy.$$('[contenteditable]:first').get(0).innerText).to.eql('start\nmiddle\ne[_I_]nd\n')
+ .type('{rightarrow}'.repeat(14)+'[_I_]').then ($el) ->
+ expect(trimInnerText($el)).to.eql('start\nmiddle\ne[_I_]nd')
it "can wrap cursor to prev line in [contenteditable] with {leftarrow}", ->
$el = cy.$$('[contenteditable]:first')
el = $el.get(0)
+
el.innerHTML = 'start'+
'middle
'+
'end
'
- cy.get('[contenteditable]:first').type('{leftarrow}'.repeat(12)+'[_I_]').then ->
- expect(cy.$$('[contenteditable]:first').get(0).innerText).to.eql('star[_I_]t\nmiddle\nend\n')
+ cy.get('[contenteditable]:first').type('{leftarrow}'.repeat(12)+'[_I_]').then ($el) ->
+ expect(trimInnerText($el)).to.eql('star[_I_]t\nmiddle\nend')
it "can wrap cursor to next line in [contenteditable] with {rightarrow} and empty lines", ->
$el = cy.$$('[contenteditable]:first')
el = $el.get(0)
- el.innerHTML = '
'.repeat(4)+
- 'end
'
+ el.innerHTML = '
'.repeat(4) + 'end
'
+
+ newLines = "\n\n\n".repeat(@multiplierNumNewLines)
cy.get('[contenteditable]:first')
.type('{selectall}{leftarrow}')
- # .type('foobar'+'{rightarrow}'.repeat(6)+'[_I_]').then ->
- # expect(cy.$$('[contenteditable]:first').get(0).innerText).to.eql('foobar\n\n\n\nen[_I_]d\n')
+ .type('foobar'+'{rightarrow}'.repeat(6)+'[_I_]').then ->
+ expect(trimInnerText($el)).to.eql("foobar#{newLines}\nen[_I_]d")
it "can use {rightarrow} and nested elements", ->
$el = cy.$$('[contenteditable]:first')
@@ -2415,19 +2449,19 @@ describe "src/cy/commands/actions/type", ->
cy.get('[contenteditable]:first')
.type('{selectall}{leftarrow}')
.type('{rightarrow}'.repeat(3)+'[_I_]').then ->
- expect(cy.$$('[contenteditable]:first').get(0).innerText).to.eql('sta[_I_]rt\n')
+ expect(trimInnerText($el)).to.eql('sta[_I_]rt')
it "enter and \\n should act the same for [contenteditable]", ->
-
cleanseText = (text) ->
- text.replace(/ /g, ' ')
+ ## non breaking white space
+ text.split('\u00a0').join(' ')
expectMatchInnerText = ($el , innerText) ->
- expect(cleanseText($el.get(0).innerText)).to.eql(innerText)
+ expect(cleanseText(trimInnerText($el))).to.eql(innerText)
## NOTE: this may only pass in Chrome since the whitespace may be different in other browsers
## even if actual and expected appear the same.
- expected = "{\n foo: 1\n bar: 2\n baz: 3\n}\n"
+ expected = "{\n foo: 1\n bar: 2\n baz: 3\n}"
cy.get('[contenteditable]:first')
.invoke('html', '
')
.type('{{}{enter} foo: 1{enter} bar: 2{enter} baz: 3{enter}}')
@@ -2438,7 +2472,6 @@ describe "src/cy/commands/actions/type", ->
.should ($el) ->
expectMatchInnerText($el, expected)
-
it "enter and \\n should act the same for textarea", ->
expected = "{\n foo: 1\n bar: 2\n baz: 3\n}"
cy.get('textarea:first')
@@ -2449,8 +2482,6 @@ describe "src/cy/commands/actions/type", ->
.type('{{}\n foo: 1\n bar: 2\n baz: 3\n}')
.should('have.prop', 'value', expected)
-
-
describe "{enter}", ->
beforeEach ->
@$forms = cy.$$("#form-submits")
diff --git a/packages/driver/test/cypress/integration/commands/navigation_spec.coffee b/packages/driver/test/cypress/integration/commands/navigation_spec.coffee
index 6f4f58609e..1489f179b3 100644
--- a/packages/driver/test/cypress/integration/commands/navigation_spec.coffee
+++ b/packages/driver/test/cypress/integration/commands/navigation_spec.coffee
@@ -91,6 +91,7 @@ describe "src/cy/commands/navigation", ->
expect(stub2).to.be.calledOnce
expect(stub3).to.be.calledOnce
+ # Array(100).fill().map ->
it "removes listeners", ->
win = cy.state("window")
@@ -100,6 +101,14 @@ describe "src/cy/commands/navigation", ->
expect(rel).to.be.calledWith("beforeunload")
expect(rel).to.be.calledWith("unload")
+
+ # cy.reload().then ->
+ # cy.wrap(null).should ->
+ # expect(rel).to.be.calledWith("beforeunload")
+ # expect(rel).to.be.calledWith("unload")
+
+
+
describe "errors", ->
beforeEach ->
Cypress.config("defaultCommandTimeout", 50)
@@ -149,6 +158,7 @@ describe "src/cy/commands/navigation", ->
expect(win.foo).to.be.undefined
it "throws when reload times out", (done) ->
+ console.time('foo')
locReload = cy.spy(Cypress.utils, "locReload")
cy
@@ -167,6 +177,8 @@ describe "src/cy/commands/navigation", ->
cy.on "fail", (err) ->
expected = true
+ console.timeEnd('foo')
+
expect(err.message).to.include "Your page did not fire its 'load' event within '1ms'."
.reload({timeout: 1})
@@ -232,17 +244,18 @@ describe "src/cy/commands/navigation", ->
$(doc.body).empty().html(@body)
## TODO: fix this
- it.skip "(FLAKY) sets timeout to Cypress.config(pageLoadTimeout)", ->
- timeout = cy.spy Promise.prototype, "timeout"
- Cypress.config("pageLoadTimeout", 4567)
+ # it.skip "(FLAKY) sets timeout to Cypress.config(pageLoadTimeout)", ->
+ # timeout = cy.spy Promise.prototype, "timeout"
+ # Cypress.config("pageLoadTimeout", 4567)
- cy
- .visit("/fixtures/jquery.html")
- .go("back").then ->
- expect(timeout).to.be.calledWith(4567, "go")
+ # cy
+ # .visit("/fixtures/jquery.html")
+ # .go("back").then ->
+ # expect(timeout).to.be.calledWith(4567, "go")
it "removes listeners", ->
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.then ->
winLoadListeners = cy.listeners("window:load")
@@ -266,6 +279,7 @@ describe "src/cy/commands/navigation", ->
stub3 = cy.stub()
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.then ->
cy.on("stability:changed", stub1)
@@ -279,6 +293,7 @@ describe "src/cy/commands/navigation", ->
it "removes listeners from window", ->
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.then (win) ->
rel = cy.stub(win, "removeEventListener")
@@ -369,6 +384,7 @@ describe "src/cy/commands/navigation", ->
it "logs go", ->
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.go("back").then ->
lastLog = @lastLog
@@ -378,12 +394,14 @@ describe "src/cy/commands/navigation", ->
it "can turn off logging", ->
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.go("back", {log: false}).then ->
expect(@lastLog).to.be.undefined
it "does not log 'Page Load' events", ->
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.go("back").then ->
@logs.slice(0).forEach (log) ->
@@ -393,6 +411,7 @@ describe "src/cy/commands/navigation", ->
beforeunload = false
cy
+ .visit("/fixtures/generic.html")
.visit("/fixtures/jquery.html")
.window().then (win) ->
cy.on "window:before:unload", =>
diff --git a/packages/driver/test/cypress/integration/e2e/return_value_spec.coffee b/packages/driver/test/cypress/integration/e2e/return_value_spec.coffee
index 9a10b99e87..0eb158f95f 100644
--- a/packages/driver/test/cypress/integration/e2e/return_value_spec.coffee
+++ b/packages/driver/test/cypress/integration/e2e/return_value_spec.coffee
@@ -29,7 +29,7 @@ describe "return values", ->
it "stringifies function bodies", (done) ->
cy.on "fail", (err) ->
- expect(err.message).to.include("> function () {")
+ expect(err.message).to.include("> function")
expect(err.message).to.include("return \"foo\";")
expect(err.message).to.include("Cypress detected that you invoked one or more cy commands but returned a different value.")
@@ -78,7 +78,7 @@ describe "return values", ->
expect(lastLog.get("name")).to.eq("foo")
expect(lastLog.get("error")).to.eq(err)
expect(err.message).to.include("> cy.foo()")
- expect(err.message).to.include("> function () {")
+ expect(err.message).to.include("> function")
expect(err.message).to.include("return \"bar\";")
expect(err.message).to.include("Cypress detected that you invoked one or more cy commands in a custom command but returned a different value.")
diff --git a/packages/runner/package.json b/packages/runner/package.json
index 74503f7007..860b7a0223 100644
--- a/packages/runner/package.json
+++ b/packages/runner/package.json
@@ -24,6 +24,7 @@
"lib"
],
"devDependencies": {
+ "@babel/plugin-proposal-decorators": "7.4.0",
"@babel/plugin-proposal-object-rest-spread": "7.4.0",
"@cypress/react-tooltip": "0.4.0",
"bin-up": "1.1.0",