|
|
|
@ -16,6 +16,7 @@ const { |
|
|
|
|
checkBrowserForConsoleErrors, |
|
|
|
|
loadExtension, |
|
|
|
|
verboseReportOnFailure, |
|
|
|
|
openNewPage, |
|
|
|
|
} = require('./helpers') |
|
|
|
|
|
|
|
|
|
describe('MetaMask', function () { |
|
|
|
@ -62,7 +63,7 @@ describe('MetaMask', function () { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (this.currentTest.state === 'failed') { |
|
|
|
|
await verboseReportOnFailure(this.currentTest) |
|
|
|
|
await verboseReportOnFailure(driver, this.currentTest) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
@ -71,14 +72,20 @@ describe('MetaMask', function () { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('New UI setup', async function () { |
|
|
|
|
let networkSelector |
|
|
|
|
it('switches to first tab', async function () { |
|
|
|
|
const [firstTab] = await driver.getAllWindowHandles() |
|
|
|
|
await driver.switchTo().window(firstTab) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
try { |
|
|
|
|
networkSelector = await findElement(driver, By.css('#network_component')) |
|
|
|
|
} catch (e) { |
|
|
|
|
await loadExtension(driver, extensionId) |
|
|
|
|
} |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('use the local network', async function () { |
|
|
|
|
const networkSelector = await findElement(driver, By.css('#network_component')) |
|
|
|
|
await networkSelector.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
@ -136,6 +143,7 @@ describe('MetaMask', function () { |
|
|
|
|
await driver.executeScript('arguments[0].scrollIntoView(true)', bottomOfTos) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
const acceptTos = await findElement(driver, By.css('.tou button')) |
|
|
|
|
driver.wait(until.elementIsEnabled(acceptTos)) |
|
|
|
|
await acceptTos.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
@ -160,8 +168,10 @@ describe('MetaMask', function () { |
|
|
|
|
let seedPhrase |
|
|
|
|
|
|
|
|
|
it('reveals the seed phrase', async () => { |
|
|
|
|
const revealSeedPhrase = await findElement(driver, By.css('.backup-phrase__secret-blocker')) |
|
|
|
|
await revealSeedPhrase.click() |
|
|
|
|
const byRevealButton = By.css('.backup-phrase__secret-blocker .backup-phrase__reveal-button') |
|
|
|
|
await driver.wait(until.elementLocated(byRevealButton, 10000)) |
|
|
|
|
const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) |
|
|
|
|
await revealSeedPhraseButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
seedPhrase = await driver.findElement(By.css('.backup-phrase__secret-words')).getText() |
|
|
|
@ -173,56 +183,76 @@ describe('MetaMask', function () { |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('can retype the seed phrase', async () => { |
|
|
|
|
const words = seedPhrase.split(' ') |
|
|
|
|
async function retypeSeedPhrase (words) { |
|
|
|
|
try { |
|
|
|
|
const word0 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[0]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
const word0 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[0]}')]`)) |
|
|
|
|
await word0.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await word0.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word1 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[1]}')]`)) |
|
|
|
|
await word1.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
const word1 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[1]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
const word2 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[2]}')]`)) |
|
|
|
|
await word2.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await word1.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word3 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[3]}')]`)) |
|
|
|
|
await word3.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
const word2 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[2]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
const word4 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[4]}')]`)) |
|
|
|
|
await word4.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await word2.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word5 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[5]}')]`)) |
|
|
|
|
await word5.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
const word3 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[3]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
const word6 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[6]}')]`)) |
|
|
|
|
await word6.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await word3.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word7 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[7]}')]`)) |
|
|
|
|
await word7.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
const word4 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[4]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
const word8 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[8]}')]`)) |
|
|
|
|
await word8.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await word4.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word9 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[9]}')]`)) |
|
|
|
|
await word9.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
const word5 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[5]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
const word10 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[10]}')]`)) |
|
|
|
|
await word10.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await word5.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word11 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[11]}')]`)) |
|
|
|
|
await word11.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
const word6 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[6]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
await word6.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word7 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[7]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
await word7.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word8 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[8]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
await word8.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word9 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[9]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
await word9.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word10 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[10]}')]`), 10000) |
|
|
|
|
|
|
|
|
|
await word10.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
|
|
|
|
|
const word11 = await findElement(driver, By.xpath(`//button[contains(text(), '${words[11]}')]`), 10000) |
|
|
|
|
await word11.click() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
} catch (e) { |
|
|
|
|
await loadExtension(driver, extensionId) |
|
|
|
|
await retypeSeedPhrase(words) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
it('can retype the seed phrase', async () => { |
|
|
|
|
const words = seedPhrase.split(' ') |
|
|
|
|
|
|
|
|
|
await retypeSeedPhrase(words) |
|
|
|
|
|
|
|
|
|
const confirm = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) |
|
|
|
|
await confirm.click() |
|
|
|
@ -230,7 +260,8 @@ describe('MetaMask', function () { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('clicks through the deposit modal', async () => { |
|
|
|
|
const buyModal = await driver.findElement(By.css('span .modal')) |
|
|
|
|
const byBuyModal = By.css('span .modal') |
|
|
|
|
const buyModal = await driver.wait(until.elementLocated(byBuyModal)) |
|
|
|
|
const closeModal = await findElement(driver, By.css('.page-container__header-close')) |
|
|
|
|
await closeModal.click() |
|
|
|
|
await driver.wait(until.stalenessOf(buyModal)) |
|
|
|
@ -244,8 +275,12 @@ describe('MetaMask', function () { |
|
|
|
|
await driver.findElement(By.css('.qr-wrapper')).isDisplayed() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
let accountModal = await driver.findElement(By.css('span .modal')) |
|
|
|
|
|
|
|
|
|
await driver.executeScript("document.querySelector('.account-modal-close').click()") |
|
|
|
|
await delay(regularDelayMs * 4) |
|
|
|
|
|
|
|
|
|
await driver.wait(until.stalenessOf(accountModal)) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
@ -345,8 +380,11 @@ describe('MetaMask', function () { |
|
|
|
|
await configureGas.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const gasModal = await driver.findElement(By.css('span .modal')) |
|
|
|
|
|
|
|
|
|
const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) |
|
|
|
|
await save.click() |
|
|
|
|
await driver.wait(until.stalenessOf(gasModal)) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
// Continue to next screen
|
|
|
|
@ -365,19 +403,20 @@ describe('MetaMask', function () { |
|
|
|
|
const transactions = await findElements(driver, By.css('.tx-list-item')) |
|
|
|
|
assert.equal(transactions.length, 1) |
|
|
|
|
|
|
|
|
|
const txValues = await findElements(driver, By.css('.tx-list-value')) |
|
|
|
|
assert.equal(txValues.length, 1) |
|
|
|
|
assert.equal(await txValues[0].getText(), '1 ETH') |
|
|
|
|
const txValues = await findElement(driver, By.css('.tx-list-value')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txValues, /1\sETH/), 10000) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Send ETH from Faucet', () => { |
|
|
|
|
it('starts a send transaction inside Faucet', async () => { |
|
|
|
|
await driver.executeScript('window.open("https://faucet.metamask.io")') |
|
|
|
|
await delay(waitingNewPageDelayMs) |
|
|
|
|
await openNewPage(driver, 'https://faucet.metamask.io') |
|
|
|
|
|
|
|
|
|
const [extension, faucet] = await driver.getAllWindowHandles() |
|
|
|
|
await driver.switchTo().window(faucet) |
|
|
|
|
|
|
|
|
|
const faucetPageTitle = await findElement(driver, By.css('.container-fluid')) |
|
|
|
|
await driver.wait(until.elementTextMatches(faucetPageTitle, /MetaMask/)) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const send1eth = await findElement(driver, By.xpath(`//button[contains(text(), '10 ether')]`), 14000) |
|
|
|
@ -403,47 +442,133 @@ describe('MetaMask', function () { |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Add existing token using search', () => { |
|
|
|
|
it('clicks on the Add Token button', async () => { |
|
|
|
|
const addToken = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Token')]`)) |
|
|
|
|
await addToken.click() |
|
|
|
|
describe('Deploy contract and call contract methods', () => { |
|
|
|
|
let extension |
|
|
|
|
let contractTestPage |
|
|
|
|
it('confirms a deploy contract transaction', async () => { |
|
|
|
|
await openNewPage(driver, 'http://127.0.0.1:8080/'); |
|
|
|
|
|
|
|
|
|
[extension, contractTestPage] = await driver.getAllWindowHandles() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const deployContractButton = await findElement(driver, By.css('#deployButton')) |
|
|
|
|
await deployContractButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const txListItem = await findElement(driver, By.css('.tx-list-item')) |
|
|
|
|
await txListItem.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) |
|
|
|
|
await confirmButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const txStatuses = await findElements(driver, By.css('.tx-list-status')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/)) |
|
|
|
|
|
|
|
|
|
const txAccounts = await findElements(driver, By.css('.tx-list-account')) |
|
|
|
|
assert.equal(await txAccounts[0].getText(), 'Contract Deployment') |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('can pick a token from the existing options', async () => { |
|
|
|
|
const tokenSearch = await findElement(driver, By.css('#search-tokens')) |
|
|
|
|
await tokenSearch.sendKeys('BAT') |
|
|
|
|
it('calls and confirms a contract method where ETH is sent', async () => { |
|
|
|
|
await driver.switchTo().window(contractTestPage) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const token = await findElement(driver, By.xpath("//span[contains(text(), 'BAT')]")) |
|
|
|
|
await token.click() |
|
|
|
|
const depositButton = await findElement(driver, By.css('#depositButton')) |
|
|
|
|
await depositButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) |
|
|
|
|
await nextScreen.click() |
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const addTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Tokens')]`)) |
|
|
|
|
await addTokens.click() |
|
|
|
|
await delay(largeDelayMs) |
|
|
|
|
const txListItem = await findElement(driver, By.css('.tx-list-item')) |
|
|
|
|
await txListItem.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
// Set the gas limit
|
|
|
|
|
const configureGas = await findElement(driver, By.css('.sliders-icon-container')) |
|
|
|
|
await configureGas.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
let gasModal = await driver.findElement(By.css('span .modal')) |
|
|
|
|
await driver.wait(until.elementLocated(By.css('.send-v2__customize-gas__title'))) |
|
|
|
|
|
|
|
|
|
const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.customize-gas-input')) |
|
|
|
|
await gasPriceInput.clear() |
|
|
|
|
await gasPriceInput.sendKeys('10') |
|
|
|
|
await gasLimitInput.clear() |
|
|
|
|
await gasLimitInput.sendKeys('60001') |
|
|
|
|
|
|
|
|
|
const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) |
|
|
|
|
await save.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
await driver.wait(until.stalenessOf(gasModal)) |
|
|
|
|
|
|
|
|
|
const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) |
|
|
|
|
await confirmButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const txStatuses = await findElements(driver, By.css('.tx-list-status')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/)) |
|
|
|
|
|
|
|
|
|
const txValues = await findElement(driver, By.css('.tx-list-value')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txValues, /3\sETH/), 10000) |
|
|
|
|
|
|
|
|
|
const txAccounts = await findElements(driver, By.css('.tx-list-account')) |
|
|
|
|
const firstTxAddress = await txAccounts[0].getText() |
|
|
|
|
assert(firstTxAddress.match(/^0x\w{8}\.{3}\w{4}$/)) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('renders the balance for the chosen token', async () => { |
|
|
|
|
it('calls and confirms a contract method where ETH is received', async () => { |
|
|
|
|
await driver.switchTo().window(contractTestPage) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const withdrawButton = await findElement(driver, By.css('#withdrawButton')) |
|
|
|
|
await withdrawButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const txListItem = await findElement(driver, By.css('.tx-list-item')) |
|
|
|
|
await txListItem.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) |
|
|
|
|
await confirmButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const txStatuses = await findElements(driver, By.css('.tx-list-status')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/)) |
|
|
|
|
|
|
|
|
|
const txValues = await findElement(driver, By.css('.tx-list-value')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txValues, /0\sETH/), 10000) |
|
|
|
|
|
|
|
|
|
await driver.switchTo().window(contractTestPage) |
|
|
|
|
await driver.close() |
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('renders the correct ETH balance', async () => { |
|
|
|
|
const balance = await findElement(driver, By.css('.tx-view .balance-display .token-amount')) |
|
|
|
|
await driver.wait(until.elementTextMatches(balance, /^0\s*BAT\s*$/), 10000) |
|
|
|
|
await driver.wait(until.elementTextMatches(balance, /^86.*ETH.*$/), 10000) |
|
|
|
|
const tokenAmount = await balance.getText() |
|
|
|
|
assert.ok(/^0\s*BAT\s*$/.test(tokenAmount)) |
|
|
|
|
assert.ok(/^86.*ETH.*$/.test(tokenAmount)) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Add a custom token from TokenFactory', () => { |
|
|
|
|
it('creates a new token', async () => { |
|
|
|
|
await driver.executeScript('window.open("https://tokenfactory.surge.sh/#/factory")') |
|
|
|
|
await delay(waitingNewPageDelayMs) |
|
|
|
|
openNewPage(driver, 'https://tokenfactory.surge.sh/#/factory') |
|
|
|
|
|
|
|
|
|
await delay(regularDelayMs * 10) |
|
|
|
|
const [extension, tokenFactory] = await driver.getAllWindowHandles() |
|
|
|
|
await driver.switchTo().window(tokenFactory) |
|
|
|
|
|
|
|
|
|
const [ |
|
|
|
|
totalSupply, |
|
|
|
|
tokenName, |
|
|
|
@ -470,12 +595,16 @@ describe('MetaMask', function () { |
|
|
|
|
|
|
|
|
|
await driver.switchTo().window(tokenFactory) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const tokenContactAddress = await driver.findElement(By.css('div > div > div:nth-child(2) > span:nth-child(3)')) |
|
|
|
|
tokenAddress = await tokenContactAddress.getText() |
|
|
|
|
|
|
|
|
|
await driver.close() |
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
await loadExtension(driver, extensionId) |
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('clicks on the Add Token button', async () => { |
|
|
|
@ -510,4 +639,212 @@ describe('MetaMask', function () { |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Send token from inside MetaMask', () => { |
|
|
|
|
let gasModal |
|
|
|
|
it('starts to send a transaction', async function () { |
|
|
|
|
const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) |
|
|
|
|
await sendButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) |
|
|
|
|
const inputAmount = await findElement(driver, By.css('.currency-display__input')) |
|
|
|
|
await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') |
|
|
|
|
await inputAmount.sendKeys('50') |
|
|
|
|
|
|
|
|
|
// Set the gas limit
|
|
|
|
|
const configureGas = await findElement(driver, By.css('.send-v2__gas-fee-display button')) |
|
|
|
|
await configureGas.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
gasModal = await driver.findElement(By.css('span .modal')) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('customizes gas', async () => { |
|
|
|
|
await driver.wait(until.elementLocated(By.css('.send-v2__customize-gas__title'))) |
|
|
|
|
const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) |
|
|
|
|
await save.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('transitions to the confirm screen', async () => { |
|
|
|
|
await driver.wait(until.stalenessOf(gasModal)) |
|
|
|
|
|
|
|
|
|
// Continue to next screen
|
|
|
|
|
const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) |
|
|
|
|
await nextScreen.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('submits the transaction', async function () { |
|
|
|
|
const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) |
|
|
|
|
await confirmButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('finds the transaction in the transactions list', async function () { |
|
|
|
|
const transactions = await findElements(driver, By.css('.tx-list-item')) |
|
|
|
|
assert.equal(transactions.length, 1) |
|
|
|
|
|
|
|
|
|
const txValues = await findElements(driver, By.css('.tx-list-value')) |
|
|
|
|
assert.equal(txValues.length, 1) |
|
|
|
|
|
|
|
|
|
// test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved,
|
|
|
|
|
// or possibly until we use latest version of firefox in the tests
|
|
|
|
|
if (process.env.SELENIUM_BROWSER !== 'firefox') { |
|
|
|
|
await driver.wait(until.elementTextMatches(txValues[0], /50\sTST/), 10000) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const txStatuses = await findElements(driver, By.css('.tx-list-status')) |
|
|
|
|
const tx = await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed|Failed/), 10000) |
|
|
|
|
assert.equal(await tx.getText(), 'Confirmed') |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Send a custom token from TokenFactory', () => { |
|
|
|
|
let gasModal |
|
|
|
|
it('sends an already created token', async () => { |
|
|
|
|
openNewPage(driver, `https://tokenfactory.surge.sh/#/token/${tokenAddress}`) |
|
|
|
|
|
|
|
|
|
const [extension, tokenFactory] = await driver.getAllWindowHandles() |
|
|
|
|
|
|
|
|
|
const [ |
|
|
|
|
transferToAddress, |
|
|
|
|
transferToAmount, |
|
|
|
|
] = await findElements(driver, By.css('.form-control')) |
|
|
|
|
|
|
|
|
|
await transferToAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') |
|
|
|
|
await transferToAmount.sendKeys('26') |
|
|
|
|
|
|
|
|
|
const transferAmountButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Transfer Amount')]`)) |
|
|
|
|
await transferAmountButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const [,, popup] = await driver.getAllWindowHandles() |
|
|
|
|
await driver.switchTo().window(popup) |
|
|
|
|
await driver.close() |
|
|
|
|
await driver.switchTo().window(extension) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const [txListItem] = await findElements(driver, By.css('.tx-list-item')) |
|
|
|
|
await txListItem.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
// Set the gas limit
|
|
|
|
|
const configureGas = await driver.wait(until.elementLocated(By.css('.send-v2__gas-fee-display button'))) |
|
|
|
|
await configureGas.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
gasModal = await driver.findElement(By.css('span .modal')) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('customizes gas', async () => { |
|
|
|
|
await driver.wait(until.elementLocated(By.css('.send-v2__customize-gas__title'))) |
|
|
|
|
|
|
|
|
|
const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.customize-gas-input')) |
|
|
|
|
await gasPriceInput.clear() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await gasPriceInput.sendKeys('10') |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await gasLimitInput.clear() |
|
|
|
|
await delay(tinyDelayMs) |
|
|
|
|
await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'a')) |
|
|
|
|
await gasLimitInput.sendKeys('60000') |
|
|
|
|
await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'e')) |
|
|
|
|
|
|
|
|
|
// Needed for different behaviour of input in different versions of firefox
|
|
|
|
|
const gasLimitInputValue = await gasLimitInput.getAttribute('value')
|
|
|
|
|
if (gasLimitInputValue === '600001') { |
|
|
|
|
await gasLimitInput.sendKeys(Key.BACK_SPACE) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const save = await findElement(driver, By.css('.send-v2__customize-gas__save')) |
|
|
|
|
await save.click() |
|
|
|
|
await driver.wait(until.stalenessOf(gasModal)) |
|
|
|
|
|
|
|
|
|
const gasFeeInput = await findElement(driver, By.css('.currency-display__input')) |
|
|
|
|
assert.equal(await gasFeeInput.getAttribute('value'), 0.0006) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('submits the transaction', async function () { |
|
|
|
|
const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) |
|
|
|
|
await confirmButton.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('finds the transaction in the transactions list', async function () { |
|
|
|
|
const transactions = await findElements(driver, By.css('.tx-list-item')) |
|
|
|
|
assert.equal(transactions.length, 2) |
|
|
|
|
|
|
|
|
|
const txValues = await findElements(driver, By.css('.tx-list-value')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txValues[0], /26\sTST/)) |
|
|
|
|
const txStatuses = await findElements(driver, By.css('.tx-list-status')) |
|
|
|
|
await driver.wait(until.elementTextMatches(txStatuses[0], /Confirmed/)) |
|
|
|
|
|
|
|
|
|
const walletBalance = await findElement(driver, By.css('.wallet-balance')) |
|
|
|
|
await walletBalance.click() |
|
|
|
|
|
|
|
|
|
const tokenListItems = await findElements(driver, By.css('.token-list-item')) |
|
|
|
|
await tokenListItems[0].click() |
|
|
|
|
|
|
|
|
|
// test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved,
|
|
|
|
|
// or possibly until we use latest version of firefox in the tests
|
|
|
|
|
if (process.env.SELENIUM_BROWSER !== 'firefox') { |
|
|
|
|
const tokenBalanceAmount = await findElement(driver, By.css('.token-balance__amount')) |
|
|
|
|
assert.equal(await tokenBalanceAmount.getText(), '24') |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Hide token', () => { |
|
|
|
|
it('hides the token when clicked', async () => { |
|
|
|
|
const [hideTokenEllipsis] = await findElements(driver, By.css('.token-list-item__ellipsis')) |
|
|
|
|
await hideTokenEllipsis.click() |
|
|
|
|
|
|
|
|
|
const byTokenMenuDropdownOption = By.css('.menu__item--clickable') |
|
|
|
|
const tokenMenuDropdownOption = await driver.wait(until.elementLocated(byTokenMenuDropdownOption)) |
|
|
|
|
|
|
|
|
|
await tokenMenuDropdownOption.click() |
|
|
|
|
|
|
|
|
|
const confirmHideModal = await findElement(driver, By.css('span .modal')) |
|
|
|
|
|
|
|
|
|
const byHideTokenConfirmationButton = By.css('.hide-token-confirmation__button') |
|
|
|
|
const hideTokenConfirmationButton = await driver.wait(until.elementLocated(byHideTokenConfirmationButton)) |
|
|
|
|
await hideTokenConfirmationButton.click() |
|
|
|
|
|
|
|
|
|
await driver.wait(until.stalenessOf(confirmHideModal)) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('Add existing token using search', () => { |
|
|
|
|
it('clicks on the Add Token button', async () => { |
|
|
|
|
const addToken = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Token')]`)) |
|
|
|
|
await addToken.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('can pick a token from the existing options', async () => { |
|
|
|
|
const tokenSearch = await findElement(driver, By.css('#search-tokens')) |
|
|
|
|
await tokenSearch.sendKeys('BAT') |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const token = await findElement(driver, By.xpath("//span[contains(text(), 'BAT')]")) |
|
|
|
|
await token.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) |
|
|
|
|
await nextScreen.click() |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
|
|
|
|
|
const addTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Tokens')]`)) |
|
|
|
|
await addTokens.click() |
|
|
|
|
await delay(largeDelayMs) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('renders the balance for the chosen token', async () => { |
|
|
|
|
const balance = await findElement(driver, By.css('.tx-view .balance-display .token-amount')) |
|
|
|
|
await driver.wait(until.elementTextMatches(balance, /0\sBAT/)) |
|
|
|
|
await delay(regularDelayMs) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|