diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js
index 0cc145fd96..a2aa4f27e8 100644
--- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js
+++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js
@@ -614,7 +614,11 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
{this._recoveryKey.encodedPrivateKey}
-
+
{_t("Copy")}
diff --git a/test/end-to-end-tests/src/usecases/signup.js b/test/end-to-end-tests/src/usecases/signup.js
index ef8a259091..ffde22f929 100644
--- a/test/end-to-end-tests/src/usecases/signup.js
+++ b/test/end-to-end-tests/src/usecases/signup.js
@@ -79,6 +79,33 @@ module.exports = async function signup(session, username, password, homeserver)
const acceptButton = await session.query('.mx_InteractiveAuthEntryComponents_termsSubmit');
await acceptButton.click();
+ //plow through cross-signing setup by entering arbitrary details
+ //TODO: It's probably important for the tests to know the passphrase
+ const xsigningPassphrase = 'a7eaXcjpa9!Yl7#V^h$B^%dovHUVX'; // https://xkcd.com/221/
+ let passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input');
+ await session.replaceInputText(passphraseField, xsigningPassphrase);
+ let xsignContButton = await session.query('.mx_CreateSecretStorageDialog_passPhraseContainer .mx_Dialog_primary');
+ await xsignContButton.click();
+
+ //repeat passphrase entry
+ passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input');
+ await session.replaceInputText(passphraseField, xsigningPassphrase);
+ xsignContButton = await session.query('.mx_CreateSecretStorageDialog_passPhraseContainer .mx_Dialog_primary');
+ await xsignContButton.click();
+
+ //ignore the recovery key
+ //TODO: It's probably important for the tests to know the recovery key
+ const copyButton = await session.query('.mx_CreateSecretStorageDialog_recoveryKeyButtons_copyBtn');
+ await copyButton.click();
+
+ //acknowledge that we copied the recovery key to a safe place
+ const copyContinueButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_primary');
+ await copyContinueButton.click();
+
+ //acknowledge that we're done cross-signing setup and our keys are safe
+ const doneOkButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_primary');
+ await doneOkButton.click();
+
//wait for registration to finish so the hash gets set
//onhashchange better?