Merge pull request #1961 from ethereum/refactorBrowserTest

Refactor browser test
pull/3094/head
yann300 6 years ago committed by GitHub
commit 45f362cbe6
  1. 24
      .babelrc
  2. 7
      .circleci/config.yml
  3. 3
      nightwatch.js
  4. 62
      package.json
  5. 14
      src/app/debugger/debuggerUI/ButtonNavigator.js
  6. 2
      src/index.js
  7. 25
      test-browser/commands/clickFunction.js
  8. 12
      test-browser/commands/clickLaunchIcon.js
  9. 18
      test-browser/commands/getEditorValue.js
  10. 17
      test-browser/commands/modalFooterOKClick.js
  11. 23
      test-browser/commands/scrollInto.js
  12. 20
      test-browser/commands/setEditorValue.js
  13. 14
      test-browser/commands/testEditorValue.js
  14. 54
      test-browser/commands/testFunction.js
  15. 144
      test-browser/helpers/contracts.js
  16. 3
      test-browser/helpers/init.js
  17. 5
      test-browser/tests/ballot.js
  18. 6
      test-browser/tests/compiling.js
  19. 7
      test-browser/tests/generalTests.js
  20. 7
      test-browser/tests/sharedFolderExplorer.js
  21. 2
      test-browser/tests/staticanalysis.js
  22. 1
      test-browser/tests/units/testRecorder.js

@ -1,23 +1,3 @@
{
"plugins": ["fast-async",
"check-es2015-constants",
"transform-es2015-arrow-functions",
"transform-es2015-block-scoped-functions",
"transform-es2015-block-scoping",
"transform-es2015-classes",
"transform-es2015-computed-properties",
"transform-es2015-destructuring",
"transform-object-rest-spread",
"transform-es2015-duplicate-keys",
"transform-es2015-for-of",
"transform-es2015-function-name",
"transform-es2015-literals",
"transform-es2015-object-super",
"transform-es2015-parameters",
"transform-es2015-shorthand-properties",
"transform-es2015-spread",
"transform-es2015-sticky-regex",
"transform-es2015-unicode-regex",
"transform-object-assign",
]
}
"presets": ["@babel/preset-env"]
}

@ -21,14 +21,7 @@ jobs:
steps:
- checkout
- restore_cache:
keys:
- dep-bundle-29-{{ checksum "package.json" }}
- run: npm install
- save_cache:
key: dep-bundle-29-{{ checksum "package.json" }}
paths:
- ~/repo/node_modules
- run: npm run lint && npm run test && npm run make-mock-compiler
- run:
name: Download Selenium

@ -1,9 +1,10 @@
'use strict'
require('@babel/register')()
module.exports = {
'src_folders': ['test-browser/tests'],
'output_folder': 'reports',
'custom_commands_path': '',
'custom_commands_path': ['test-browser/commands'],
'custom_assertions_path': '',
'page_objects_path': '',
'globals_path': '',

@ -3,22 +3,25 @@
"version": "v0.8.3",
"description": "Minimalistic browser-based Solidity IDE",
"devDependencies": {
"@babel/core": "^7.4.5",
"@babel/plugin-transform-object-assign": "^7.2.0",
"@babel/polyfill": "^7.4.4",
"@babel/preset-env": "^7.4.5",
"@babel/preset-es2015": "latest",
"@babel/preset-es2017": "latest",
"@babel/preset-stage-0": "^7.0.0",
"@babel/register": "^7.4.4",
"@fortawesome/fontawesome-free": "^5.8.1",
"@resolver-engine/imports": "^0.3.0",
"ace-mode-solidity": "^0.1.0",
"async": "^2.1.2",
"babel-eslint": "^7.1.1",
"babel-plugin-transform-modern-regexp": "0.0.6",
"babel-plugin-transform-object-assign": "^6.22.0",
"babel-eslint": "^10.0.0",
"babel-plugin-fast-async": "^6.1.2",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-plugin-yo-yoify": "^0.3.3",
"babel-polyfill": "^6.22.0",
"babel-preset-env": "^1.6.1",
"babel-preset-es2015": "^6.24.0",
"babel-preset-es2017": "^6.24.1",
"babel-preset-stage-0": "^6.24.1",
"babelify": "^7.3.0",
"babel-plugin-yo-yoify": "^2.0.0",
"babelify": "^10.0.0",
"brace": "^0.8.0",
"browserify": "^16.2.3",
"browserify-reload": "^1.0.3",
"component-type": "^1.2.1",
"copy-text-to-clipboard": "^1.0.4",
@ -26,11 +29,11 @@
"csslint": "^1.0.2",
"deep-equal": "^1.0.1",
"ethereumjs-util": "^5.1.2",
"events": "^3.0.0",
"ethers": "^4.0.27",
"events": "^3.0.0",
"execr": "^1.0.1",
"exorcist": "^0.4.0",
"fast-async": "6.3.1",
"fast-async": "^7.0.6",
"fast-levenshtein": "^2.0.6",
"gists": "^1.0.1",
"javascript-serialize": "^1.6.1",
@ -39,6 +42,7 @@
"js-beautify": "1.6.14",
"minixhr": "^3.2.2",
"mkdirp": "^0.5.1",
"nanohtml": "^1.6.3",
"nightwatch": "^0.9.20",
"notify-error": "^1.2.0",
"npm-link-local": "^1.1.0",
@ -95,29 +99,6 @@
],
"parser": "babel-eslint"
},
"babel": {
"plugins": [
"transform-es2015-template-literals",
"transform-es2015-literals",
"transform-es2015-function-name",
"transform-es2015-arrow-functions",
"transform-es2015-block-scoped-functions",
"transform-es2015-classes",
"transform-es2015-object-super",
"transform-es2015-shorthand-properties",
"transform-es2015-duplicate-keys",
"transform-es2015-computed-properties",
"transform-es2015-for-of",
"transform-es2015-sticky-regex",
"transform-es2015-unicode-regex",
"check-es2015-constants",
"transform-es2015-spread",
"transform-es2015-parameters",
"transform-es2015-destructuring",
"transform-es2015-block-scoping",
"transform-modern-regexp"
]
},
"browserify": {
"transform": [
[
@ -127,7 +108,7 @@
"sourceMaps": true,
"plugins": [
[
"fast-async",
"module:fast-async",
{
"runtimePattern": null,
"compiler": {
@ -139,14 +120,14 @@
}
],
[
"yo-yoify"
"module:babel-plugin-yo-yoify"
],
[
"transform-object-assign"
"module:@babel/plugin-transform-object-assign"
]
],
"presets": [
"es2015"
"@babel/preset-env"
]
}
]
@ -193,6 +174,7 @@
"test": "csslint && standard && node test/index.js",
"test-browser": "npm-run-all -lpr selenium downloadsolc_root make-mock-compiler serve browsertest",
"watch": "watchify src/index.js -dv -p browserify-reload -o build/app.js --exclude solc",
"reinstall": "rm ./node-modules/ -rf; rm package-lock.json; rm ./build/ -rf; npm install; npm run build"
"reinstall": "rm ./node-modules/ -rf; rm package-lock.json; rm ./build/ -rf; npm install; npm run build",
"postinstall": "cd .. && git clone https://github.com/ethereum/remix && cd remix && git checkout 517db1adce48feac758aff7465241c0dd385b906 && npm install && npm run bootstrap && cd .. && cd repo && npm run setupremix"
}
}

@ -46,16 +46,16 @@ ButtonNavigator.prototype.render = function () {
var self = this
var view = yo`<div class="${css.buttons}">
<div class="${css.stepButtons} btn-group p-1">
<button id='overback' class='btn btn-primary btn-sm' title='Step over back' class='${css.navigator} ${css.stepButton} fas fa-reply' onclick=${function () { self.event.trigger('stepOverBack') }} disabled=${this.overBackDisabled} ></button>
<button id='intoback' class='btn btn-primary btn-sm' title='Step back' class='${css.navigator} ${css.stepButton} fas fa-level-up-alt' onclick=${function () { self.event.trigger('stepIntoBack') }} disabled=${this.intoBackDisabled} ></button>
<button id='intoforward' class='btn btn-primary btn-sm' title='Step into' class='${css.navigator} ${css.stepButton} fas fa-level-down-alt' onclick=${function () { self.event.trigger('stepIntoForward') }} disabled=${this.intoForwardDisabled} ></button>
<button id='overforward' class='btn btn-primary btn-sm' title='Step over forward' class='${css.navigator} ${css.stepButton} fas fa-share' onclick=${function () { self.event.trigger('stepOverForward') }} disabled=${this.overForwardDisabled} ></button>
<button id='overback' class='btn btn-primary btn-sm ${css.navigator} ${css.stepButton} fas fa-reply' title='Step over back' onclick=${function () { self.event.trigger('stepOverBack') }} disabled=${this.overBackDisabled} ></button>
<button id='intoback' class='btn btn-primary btn-sm ${css.navigator} ${css.stepButton} fas fa-level-up-alt' title='Step back' onclick=${function () { self.event.trigger('stepIntoBack') }} disabled=${this.intoBackDisabled} ></button>
<button id='intoforward' class='btn btn-primary btn-sm ${css.navigator} ${css.stepButton} fas fa-level-down-alt' title='Step into' onclick=${function () { self.event.trigger('stepIntoForward') }} disabled=${this.intoForwardDisabled} ></button>
<button id='overforward' class='btn btn-primary btn-sm ${css.navigator} ${css.stepButton} fas fa-share' title='Step over forward'onclick=${function () { self.event.trigger('stepOverForward') }} disabled=${this.overForwardDisabled} ></button>
</div>
<div class="${css.jumpButtons} btn-group p-1">
<button class='btn btn-primary btn-sm' id='jumppreviousbreakpoint' title='Jump to the previous breakpoint' class='${css.navigator} ${css.jumpButton} fas fa-step-backward' onclick=${function () { self.event.trigger('jumpPreviousBreakpoint') }} disabled=${this.jumpPreviousBreakpointDisabled} ></button>
<button class='btn btn-primary btn-sm' id='jumpout' title='Jump out' class='${css.navigator} ${css.jumpButton} fas fa-eject' onclick=${function () { self.event.trigger('jumpOut') }} disabled=${this.jumpOutDisabled} ></button>
<button class='btn btn-primary btn-sm' id='jumpnextbreakpoint' title='Jump to the next breakpoint' class='${css.navigator} ${css.jumpButton} fas fa-step-forward' onclick=${function () { self.event.trigger('jumpNextBreakpoint') }} disabled=${this.jumpNextBreakpointDisabled} ></button>
<button class='btn btn-primary btn-sm ${css.navigator} ${css.jumpButton} fas fa-step-backward' id='jumppreviousbreakpoint' title='Jump to the previous breakpoint' onclick=${function () { self.event.trigger('jumpPreviousBreakpoint') }} disabled=${this.jumpPreviousBreakpointDisabled} ></button>
<button class='btn btn-primary btn-sm ${css.navigator} ${css.jumpButton} fas fa-eject' id='jumpout' title='Jump out' onclick=${function () { self.event.trigger('jumpOut') }} disabled=${this.jumpOutDisabled} ></button>
<button class='btn btn-primary btn-sm ${css.navigator} ${css.jumpButton} fas fa-step-forward' id='jumpnextbreakpoint' title='Jump to the next breakpoint' onclick=${function () { self.event.trigger('jumpNextBreakpoint') }} disabled=${this.jumpNextBreakpointDisabled} ></button>
</div>
<div id='reverted' style="display:none">
<button class='btn btn-danger btn-sm' id='jumptoexception' title='Jump to exception' class='${css.navigator} ${css.button} fas fa-exclamation-triangle' onclick=${function () { self.event.trigger('jumpToException') }} disabled=${this.jumpOutDisabled} >

@ -1,6 +1,6 @@
'use strict'
require('babel-polyfill')
require('@babel/polyfill')
var App = require('./app.js')
var app = new App({})

@ -0,0 +1,25 @@
const EventEmitter = require('events')
class ClickFunction extends EventEmitter {
command (fnFullName, expectedInput) {
this.api.waitForElementPresent('.instance button[title="' + fnFullName + '"]')
.perform(function (client, done) {
client.execute(function () {
document.querySelector('#runTabView').scrollTop = document.querySelector('#runTabView').scrollHeight
}, [], function () {
if (expectedInput) {
client.setValue('#runTabView input[title="' + expectedInput.types + '"]', expectedInput.values, function () {})
}
done()
})
})
.click('.instance button[title="' + fnFullName + '"]')
.pause(500)
.perform(() => {
this.emit('complete')
})
return this
}
}
module.exports = ClickFunction

@ -0,0 +1,12 @@
const EventEmitter = require('events')
class ClickLaunchIcon extends EventEmitter {
command (icon) {
this.api.click('#icon-panel div[plugin="' + icon + '"]').perform(() => {
this.emit('complete')
})
return this
}
}
module.exports = ClickLaunchIcon

@ -0,0 +1,18 @@
const EventEmitter = require('events')
class GetEditorValue extends EventEmitter {
command (callback) {
this.api.perform((client, done) => {
this.api.execute(function (value) {
return document.getElementById('input').editor.getValue()
}, [], (result) => {
done(result.value)
callback(result.value)
this.emit('complete')
})
})
return this
}
}
module.exports = GetEditorValue

@ -0,0 +1,17 @@
const EventEmitter = require('events')
class ModalFooterOKClick extends EventEmitter {
command () {
this.api.perform((client, done) => {
this.api.execute(function () {
document.querySelector('#modal-footer-ok').click()
}, [], (result) => {
done()
this.emit('complete')
})
})
return this
}
}
module.exports = ModalFooterOKClick

@ -0,0 +1,23 @@
const EventEmitter = require('events')
class ScrollInto extends EventEmitter {
command (target) {
this.api.perform((client, done) => {
_scrollInto(this.api, target, () => {
done()
this.emit('complete')
})
})
return this
}
}
function _scrollInto (browser, target, cb) {
browser.execute(function (target) {
document.querySelector(target).scrollIntoView()
}, [target], function () {
cb()
})
}
module.exports = ScrollInto

@ -0,0 +1,20 @@
const EventEmitter = require('events')
class SetEditorValue extends EventEmitter {
command (value, callback) {
this.api.perform((client, done) => {
this.api.execute(function (value) {
document.getElementById('input').editor.session.setValue(value)
}, [value], (result) => {
done()
if (callback) {
callback.call(this.api)
}
this.emit('complete')
})
})
return this
}
}
module.exports = SetEditorValue

@ -0,0 +1,14 @@
const EventEmitter = require('events')
class TestEditorValue extends EventEmitter {
command (testvalue, callback) {
this.api.getEditorValue((value) => {
this.api.assert.equal(testvalue, value)
callback()
this.emit('complete')
})
return this
}
}
module.exports = TestEditorValue

@ -0,0 +1,54 @@
const EventEmitter = require('events')
const deepequal = require('deep-equal')
class TestFunction extends EventEmitter {
command (fnFullName, txHash, log, expectedInput, expectedReturn, expectedEvent, callback) {
this.api.waitForElementPresent('.instance button[title="' + fnFullName + '"]')
.perform(function (client, done) {
client.execute(function () {
document.querySelector('#runTabView').scrollTop = document.querySelector('#runTabView').scrollHeight
}, [], function () {
if (expectedInput) {
client.setValue('#runTabView input[title="' + expectedInput.types + '"]', expectedInput.values, function () {})
}
done()
})
})
.click('.instance button[title="' + fnFullName + '"]')
.pause(500)
.waitForElementPresent('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"]')
.assert.containsText('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] span', log)
.click('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] div[class^="log"]')
.perform(function (client, done) {
if (expectedReturn) {
client.getText('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] table[class^="txTable"] #decodedoutput', (result) => {
console.log(result)
var equal = deepequal(JSON.parse(result.value), JSON.parse(expectedReturn))
if (!equal) {
client.assert.fail('expected ' + expectedReturn + ' got ' + result.value, 'info about error', '')
}
})
}
done()
})
.perform((client, done) => {
if (expectedEvent) {
client.getText('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] table[class^="txTable"] #logs', (result) => {
console.log(result)
var equal = deepequal(JSON.parse(result.value), JSON.parse(expectedEvent))
if (!equal) {
client.assert.fail('expected ' + expectedEvent + ' got ' + result.value, 'info about error', '')
}
})
}
done()
if (callback) {
callback.call(this.api)
}
this.emit('complete')
})
return this
}
}
module.exports = TestFunction

@ -2,38 +2,25 @@
var deepequal = require('deep-equal')
module.exports = {
getCompiledContracts: getCompiledContracts,
testContracts: testContracts,
addFile: addFile,
switchFile: switchFile,
verifyContract: verifyContract,
getCompiledContracts,
testContracts,
addFile,
switchFile,
verifyContract,
selectContract,
testFunction,
testConstantFunction,
checkDebug,
goToVMtraceStep,
useFilter,
addInstance,
clickFunction,
verifyCallReturnValue,
createContract,
modalFooterOKClick,
setEditorValue,
getEditorValue,
testEditorValue,
renameFile,
removeFile,
getAddressAtPosition,
clickLaunchIcon,
scrollInto,
signMsg
}
function clickLaunchIcon (icon) {
this.click('#icon-panel div[plugin="' + icon + '"]')
return this
}
function getCompiledContracts (browser, compiled, callback) {
browser.clickLaunchIcon('solidity').execute(function () {
var contracts = document.querySelectorAll('#compileTabView select option')
@ -98,23 +85,6 @@ function testContracts (browser, fileName, contractCode, compiledContractNames,
})
}
function clickFunction (fnFullName, expectedInput) {
this.waitForElementPresent('.instance button[title="' + fnFullName + '"]')
.perform(function (client, done) {
client.execute(function () {
document.querySelector('#runTabView').scrollTop = document.querySelector('#runTabView').scrollHeight
}, [], function () {
if (expectedInput) {
client.setValue('#runTabView input[title="' + expectedInput.types + '"]', expectedInput.values, function () {})
}
done()
})
})
.click('.instance button[title="' + fnFullName + '"]')
.pause(500)
return this
}
function verifyCallReturnValue (browser, address, checks, done) {
console.log('verifyCallReturnValue address', address)
browser.execute(function (address) {
@ -163,14 +133,6 @@ function testConstantFunction (browser, address, fnFullName, expectedInput, expe
})
}
function scrollInto (target) {
return this.perform((client, done) => {
_scrollInto(this, target, () => {
done()
})
})
}
function signMsg (browser, msg, cb) {
let hash, signature
browser
@ -197,72 +159,6 @@ function signMsg (browser, msg, cb) {
})
}
function _scrollInto (browser, target, cb) {
browser.execute(function (target) {
document.querySelector(target).scrollIntoView()
}, [target], function () {
cb()
})
}
function testFunction (fnFullName, txHash, log, expectedInput, expectedReturn, expectedEvent, callback) {
// this => browser
this.waitForElementPresent('.instance button[title="' + fnFullName + '"]')
.perform(function (client, done) {
client.execute(function () {
document.querySelector('#runTabView').scrollTop = document.querySelector('#runTabView').scrollHeight
}, [], function () {
if (expectedInput) {
client.setValue('#runTabView input[title="' + expectedInput.types + '"]', expectedInput.values, function () {})
}
done()
})
})
.click('.instance button[title="' + fnFullName + '"]')
.pause(500)
.waitForElementPresent('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"]')
.assert.containsText('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] span', log)
.click('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] div[class^="log"]')
.perform(function (client, done) {
if (expectedReturn) {
client.getText('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] table[class^="txTable"] #decodedoutput', (result) => {
console.log(result)
var equal = deepequal(JSON.parse(result.value), JSON.parse(expectedReturn))
if (!equal) {
client.assert.fail('expected ' + expectedReturn + ' got ' + result.value, 'info about error', '')
}
})
}
done()
})
.perform(function (client, done) {
if (expectedEvent) {
client.getText('#editor-container div[class^="terminal"] span[id="tx' + txHash + '"] table[class^="txTable"] #logs', (result) => {
console.log(result)
var equal = deepequal(JSON.parse(result.value), JSON.parse(expectedEvent))
if (!equal) {
client.assert.fail('expected ' + expectedEvent + ' got ' + result.value, 'info about error', '')
}
})
}
done()
if (callback) callback()
})
return this
}
function setEditorValue (value, callback) {
this.perform((client, done) => {
this.execute(function (value) {
document.getElementById('input').editor.session.setValue(value)
}, [value], function (result) {
done()
if (callback) callback()
})
})
return this
}
function addInstance (browser, address, isValidFormat, isValidChecksum, callback) {
browser.clickLaunchIcon('run').clearValue('.ataddressinput').setValue('.ataddressinput', address, function () {
browser.click('div[class^="atAddress"]')
@ -281,36 +177,6 @@ function addInstance (browser, address, isValidFormat, isValidChecksum, callback
})
}
function getEditorValue (callback) {
this.perform((client, done) => {
this.execute(function (value) {
return document.getElementById('input').editor.getValue()
}, [], function (result) {
done(result.value)
callback(result.value)
})
})
return this
}
function testEditorValue (testvalue, callback) {
this.getEditorValue((value) => {
this.assert.equal(testvalue, value)
callback()
})
}
function modalFooterOKClick () {
this.perform((client, done) => {
this.execute(function () {
document.querySelector('#modal-footer-ok').click()
}, [], function (result) {
done()
})
})
return this
}
function addFile (browser, name, content, done) {
browser.clickLaunchIcon('run').clickLaunchIcon('fileExplorers').click('.newFile')
.perform((client, done) => {

@ -1,7 +1,4 @@
var helpers = require('./contracts')
module.exports = function (browser, callback) {
browser.clickLaunchIcon = helpers.clickLaunchIcon
browser
.url('http://127.0.0.1:8080/#version=builtin')
.injectScript('test-browser/helpers/applytestmode.js', function () {

@ -22,11 +22,6 @@ module.exports = {
}
function runTests (browser, testData) {
browser.testFunction = contractHelper.testFunction
browser.clickFunction = contractHelper.clickFunction
browser.modalFooterOKClick = contractHelper.modalFooterOKClick
browser.setEditorValue = contractHelper.setEditorValue
browser.clickLaunchIcon = contractHelper.clickLaunchIcon
browser
.waitForElementVisible('#icon-panel', 10000)
.clickLaunchIcon('solidity')

@ -19,12 +19,6 @@ module.exports = {
}
function runTests (browser) {
browser.testFunction = contractHelper.testFunction
browser.clickFunction = contractHelper.clickFunction
browser.setEditorValue = contractHelper.setEditorValue
browser.modalFooterOKClick = contractHelper.modalFooterOKClick
browser.getEditorValue = contractHelper.getEditorValue
browser.clickLaunchIcon = contractHelper.clickLaunchIcon
browser
.waitForElementVisible('#icon-panel', 10000)
.clickLaunchIcon('solidity')

@ -18,13 +18,6 @@ module.exports = {
}
function runTests (browser) {
browser.setEditorValue = contractHelper.setEditorValue
browser.getEditorValue = contractHelper.getEditorValue
browser.clickLaunchIcon = contractHelper.clickLaunchIcon
browser.modalFooterOKClick = contractHelper.modalFooterOKClick
browser.clickFunction = contractHelper.clickFunction
browser.scrollInto = contractHelper.scrollInto
browser.verifyCallReturnValue = contractHelper.verifyCallReturnValue
browser
.waitForElementVisible('#icon-panel', 10000)
.clickLaunchIcon('solidity')

@ -46,13 +46,6 @@ module.exports = {
}
function runTests (browser, testData) {
browser.testFunction = contractHelper.testFunction
browser.clickFunction = contractHelper.clickFunction
browser.setEditorValue = contractHelper.setEditorValue
browser.modalFooterOKClick = contractHelper.modalFooterOKClick
browser.getEditorValue = contractHelper.getEditorValue
browser.testEditorValue = contractHelper.testEditorValue
browser.clickLaunchIcon = contractHelper.clickLaunchIcon
var browserName = browser.options.desiredCapabilities.browserName
if (browserName === 'safari' || browserName === 'internet explorer') {
console.log('do not run remixd test for ' + browserName + ': sauce labs doesn\'t seems to handle websocket')

@ -33,8 +33,6 @@ module.exports = {
}
function runTests (browser) {
browser.setEditorValue = contractHelper.setEditorValue
browser.clickLaunchIcon = contractHelper.clickLaunchIcon
browser
.waitForElementVisible('#icon-panel', 10000)
.clickLaunchIcon('solidity')

@ -7,7 +7,6 @@ module.exports = {
return sources
},
test: function (browser, callback) {
browser.clickLaunchIcon = contractHelper.clickLaunchIcon
contractHelper.addFile(browser, 'scenario.json', {content: records}, () => {
browser
.clickLaunchIcon('run')

Loading…
Cancel
Save