diff --git a/conda/js/test/selenium_tutorial_test.js b/conda/js/test/selenium_tutorial_test.js
index 2d1332bd24cc1f9fdd1c98f590f82d136326da48..fc9cd577c21e0ab322f9d0f96beb2fcbb43c2dd5 100644
--- a/conda/js/test/selenium_tutorial_test.js
+++ b/conda/js/test/selenium_tutorial_test.js
@@ -2,11 +2,14 @@
 const {Builder, By, Key, until} = require('selenium-webdriver');
 const firefox = require('selenium-webdriver/firefox');
 
+const winX = 1920, winY = 1080;
 const options = new firefox.Options();
 options.addArguments('-headless');
+options.addArguments(`--window-size=${ winX },${ winY }`);
 
 (async function example() {
 	let driver = await new Builder().forBrowser('firefox').setFirefoxOptions(options).build();
+	await driver.manage().window().setRect({x: 0, y: 0, width: winX, height: winY});
 	try {
 		await driver.get('http://localhost:9101/');
 
@@ -25,17 +28,17 @@ options.addArguments('-headless');
 
 		// make new exp
 		const eUser = await driver.findElement(By.css('input[placeholder="Experiment user..."]'));
-		eUser.clear();
-		eUser.sendKeys('selenium');
+		await eUser.clear();
+		await eUser.sendKeys('selenium');
 		const eName = driver.findElement(By.css('input[placeholder="Experiment name..."]'));
-		eName.clear();
-		eName.sendKeys('means');
+		await eName.clear();
+		await eName.sendKeys('means');
 		await driver.sleep(1000);
 		await driver.findElement(By.css('.modal button.btn-primary')).click();
-
-		// go to new exp
 		await driver.wait(until.elementLocated(By.linkText('selenium/test/iris/1/means')), 2000);
 		await driver.sleep(1000);
+
+		// go to new exp
 		await driver.findElement(By.linkText('selenium/test/iris/1/means')).click();
 		await driver.wait(until.elementLocated(By.css('div.experimentEditor')), 2000);
 
@@ -60,14 +63,179 @@ options.addArguments('-headless');
 		await driver.findElement(By.css('div.experimentEditor > div.d-flex > button.btn-outline-secondary')).click();
 		await driver.sleep(1000);
 
+		/**************************************************************
+		 * CLEANUP
+		 */
+
+		// go back and delete exp
+		await driver.findElement(By.linkText('experiments')).click();
+		await driver.wait(until.elementLocated(By.css('input[placeholder="Search experiments..."]'), 2000));
+		eLink = await driver.findElement(By.linkText('selenium/test/iris/1/means'));
+		await eLink.findElement(By.xpath('../..')).findElement(By.css('button.btn-outline-danger')).click();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('.modal button.btn-danger')).click();
+		await driver.sleep(1000);
+
 		/**************************************************************
 		 * ADVANCED IRIS TOOLCHAIN
 		 */
+		// navigate to tc list
+		await driver.findElement(By.linkText('toolchains')).click();
+		await driver.wait(until.elementLocated(By.css('input[placeholder="Search toolchains..."]'), 2000));
+
+		// click the clone button next to test/iris/1
+		let tLink = await driver.findElement(By.linkText('test/iris/1'));
+		await tLink.findElement(By.xpath('../..')).findElement(By.css('button.btn-outline-success + button.btn-outline-success')).click();
+		await driver.wait(until.elementLocated(By.css('.modal')), 2000);
+
+		// make new tc
+		const tUser = await driver.findElement(By.css('input[placeholder="Toolchain user..."]'));
+		await tUser.clear();
+		await tUser.sendKeys('selenium');
+		const tName = driver.findElement(By.css('input[placeholder="New toolchain name..."]'));
+		await tName.clear();
+		await tName.sendKeys('iris_advanced');
+		await driver.sleep(1000);
+		await driver.findElement(By.css('.modal button.btn-primary')).click();
+		await driver.wait(until.elementLocated(By.linkText('selenium/iris_advanced/1')), 2000);
+		await driver.sleep(1000);
+
+		// go to new tc
+		await driver.findElement(By.linkText('selenium/iris_advanced/1')).click();
+		await driver.wait(until.elementLocated(By.css('div.toolchainEditor')), 2000);
+
+		// delete conn between training_data.measurements & training_alg.measurements
+		let rcEl = await driver.findElement(By.css('#\\#training_data-measurements-training_alg-measurements'));
+		await driver.actions().contextClick(rcEl).perform();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('nav.react-contextmenu--visible > div')).click();
+
+		// delete conn between testing_data.measurements & testing_alg.measurements
+		rcEl = await driver.findElement(By.css('#\\#testing_data-measurements-testing_alg-measurements'));
+		await driver.actions().contextClick(rcEl).perform();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('nav.react-contextmenu--visible > div')).click();
+
+		// add training preprocessor block way below the rest of the toolchain
+		let originEl = await driver.findElement(By.css('#block_testing_data'));
+		await driver.actions().move({x: 100, y: 100, origin: originEl}).pause(500).contextClick().perform();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('nav.react-contextmenu--visible > div:first-child')).click();
+
+		// edit training preprocessor
+		await driver.findElement(By.css('#block_block')).click();
+		await driver.sleep(1000);
+		// name
+		let tbName = await driver.findElement(By.css('#tcModalInitFocus'));
+		tbName.clear();
+		tbName.sendKeys('pre_training');
+		// input
+		await driver.findElement(By.css('.modal-body .btn-secondary')).click();
+		let tbiName = await driver.findElement(By.css('.modal-body > form > div.row input'));
+		await tbiName.clear();
+		await tbiName.sendKeys('measurements');
+		// output
+		await driver.findElement(By.css('.modal-body .col-sm-6 + .col-sm-6 .btn-secondary')).click();
+		let tboName = await driver.findElement(By.css('.modal-body > form > div.row .col-sm-6 + .col-sm-6 input'));
+		await tboName.clear();
+		await tboName.sendKeys('measurements');
+		await driver.sleep(1000);
+		//close
+		await driver.findElement(By.css('.modal button.close')).click();
+		await driver.sleep(1000);
+
+		// copy the block
+		rcEl = await driver.findElement(By.css('#block_pre_training'));
+		await driver.actions().contextClick(rcEl).perform();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('nav.react-contextmenu--visible > div + div')).click();
+
+		// paste testing preprocessor block way below the rest of the toolchain
+		originEl = await driver.findElement(By.css('#block_pre_training'));
+		await driver.actions().move({x: 150, origin: originEl}).pause(500).contextClick().perform();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('nav.react-contextmenu--visible > div:first-child')).click();
+
+		// unselect pasted block
+		await driver.actions().move({y: 200, origin: originEl}).pause(500).click().pause(500).perform();
+
+		// edit the block name
+		await driver.findElement(By.css('#block_pre_training0')).click();
+		await driver.sleep(1000);
+		tbName = await driver.findElement(By.css('#tcModalInitFocus'));
+		await tbName.clear();
+		await tbName.sendKeys('pre_testing');
+		await driver.sleep(1000);
+		//close
+		await driver.findElement(By.css('.modal button.close')).click();
+		await driver.sleep(1000);
+
+		//console.log('connecting');
+		// connect pre_training to rest of tc
+		// data to pre
+		let fromBox = await driver.findElement(By.css('rect#training_data-output-measurements'));
+		let toBox = await driver.findElement(By.css('rect#pre_training-input-measurements'));
+		await driver.actions().dragAndDrop(fromBox, toBox).pause(500).perform();
+		// pre to alg
+		fromBox = await driver.findElement(By.css('rect#pre_training-output-measurements'));
+		toBox = await driver.findElement(By.css('rect#training_alg-input-measurements'));
+		await driver.actions().dragAndDrop(fromBox, toBox).pause(500).perform();
+
+		//console.log('connecting 2');
+		// connect pre_testing to rest of tc
+		// data to pre
+		fromBox = await driver.findElement(By.css('rect#testing_data-output-measurements'));
+		toBox = await driver.findElement(By.css('rect#pre_testing-input-measurements'));
+		await driver.actions().dragAndDrop(fromBox, toBox).pause(500).perform();
+		// pre to alg
+		fromBox = await driver.findElement(By.css('rect#pre_testing-output-measurements'));
+		toBox = await driver.findElement(By.css('rect#testing_alg-input-measurements'));
+		await driver.actions().dragAndDrop(fromBox, toBox).pause(500).perform();
+
+		//console.log('fix channel');
+		// fix the channel on pre_training
+		await driver.findElement(By.css('#block_pre_training')).click();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('.modal-body select.form-control')).click();
+		await driver.findElement(By.css('.modal-body option[value="training_data"]')).click();
+		await driver.sleep(500);
+		await driver.findElement(By.css('.modal button.close')).click();
+		await driver.sleep(1000);
+
+		//console.log('getting layout');
+		// layout the tc
+		await driver.findElement(By.xpath('//button[contains(.,"Layout")]')).click();
+		// needs to communicate w graphviz, give it some time
+		await driver.sleep(5000);
+
+		// make sure the tc is still valid
+		await driver.wait(until.elementLocated(By.css('.badge-success')), 2000);
+
+		// save
+		//await driver.findElement(By.css('div.toolchainEditor > div.d-flex > button.btn-outline-secondary')).click();
+		//await driver.sleep(1000);
+
+		/**************************************************************
+		 * CLEANUP
+		 */
+
+		// go back and delete toolchain
+		await driver.findElement(By.linkText('toolchains')).click();
+		await driver.wait(until.elementLocated(By.css('input[placeholder="Search toolchains..."]'), 2000));
+		tLink = await driver.findElement(By.linkText('selenium/iris_advanced/1'));
+		await tLink.findElement(By.xpath('../..')).findElement(By.css('button.btn-outline-danger')).click();
+		await driver.sleep(1000);
+		await driver.findElement(By.css('.modal button.btn-danger')).click();
+		await driver.sleep(1000);
 
 		/**************************************************************
 		 * ADVANCED IRIS PREPROCESSOR ALGORITHM
 		 */
 
+		/**************************************************************
+		 * CLEANUP
+		 */
+
 		/**************************************************************
 		 * ADVANCED IRIS EXPERIMENT
 		 */
@@ -76,15 +244,6 @@ options.addArguments('-headless');
 		 * CLEANUP
 		 */
 
-		// go back and delete exp
-		await driver.findElement(By.linkText('experiments')).click();
-		await driver.wait(until.elementLocated(By.css('input[placeholder="Search experiments..."]'), 2000));
-		eLink = await driver.findElement(By.linkText('selenium/test/iris/1/means'));
-		await eLink.findElement(By.xpath('../..')).findElement(By.css('button.btn-outline-danger')).click();
-		await driver.sleep(1000);
-		await driver.findElement(By.css('.modal button.btn-danger')).click();
-		await driver.sleep(1000);
-
 		console.log('selenium tests finished successfully!');
 	} catch(e) {
 		console.log('selenium tests failed!');