diff --git a/conda/js/test/selenium_tutorial_test.js b/conda/js/test/selenium_tutorial_test.js
index fc9cd577c21e0ab322f9d0f96beb2fcbb43c2dd5..df6170deda63248d967412cb5c10c9a0a659bc0a 100644
--- a/conda/js/test/selenium_tutorial_test.js
+++ b/conda/js/test/selenium_tutorial_test.js
@@ -2,8 +2,13 @@
 const {Builder, By, Key, until} = require('selenium-webdriver');
 const firefox = require('selenium-webdriver/firefox');
 
+// window size we're testing with
 const winX = 1920, winY = 1080;
 const options = new firefox.Options();
+// sometimes, selenium will hang forever in the middle of the test if the test is ran headlessly
+// if you encounter this issue, comment out this headless flag
+// (it doesn't seem to ever hang when running non-headlessly)
+// the test shouldnt take more than a minute-ish either way
 options.addArguments('-headless');
 options.addArguments(`--window-size=${ winX },${ winY }`);
 
@@ -16,6 +21,7 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		/**************************************************************
 		 * MEANS EXP
 		 */
+
 		// navigate to exp list
 		await driver.findElement(By.linkText('experiments')).click();
 		//.sendKeys('webdriver', Key.RETURN);
@@ -27,10 +33,10 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		await driver.wait(until.elementLocated(By.css('.modal')), 2000);
 
 		// make new exp
-		const eUser = await driver.findElement(By.css('input[placeholder="Experiment user..."]'));
+		let eUser = await driver.findElement(By.css('input[placeholder="Experiment user..."]'));
 		await eUser.clear();
 		await eUser.sendKeys('selenium');
-		const eName = driver.findElement(By.css('input[placeholder="Experiment name..."]'));
+		let eName = driver.findElement(By.css('input[placeholder="Experiment name..."]'));
 		await eName.clear();
 		await eName.sendKeys('means');
 		await driver.sleep(1000);
@@ -79,6 +85,7 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		/**************************************************************
 		 * 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));
@@ -170,18 +177,16 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		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();
+		await driver.actions().dragAndDrop(fromBox, toBox).pause(200).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();
+		await driver.actions().dragAndDrop(fromBox, toBox).pause(200).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'));
@@ -192,7 +197,6 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		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);
@@ -202,7 +206,6 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		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
@@ -212,38 +215,161 @@ options.addArguments(`--window-size=${ winX },${ winY }`);
 		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);
+		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
-		 */
+		// navigate to alg list
+		await driver.findElement(By.linkText('algorithms')).click();
+		await driver.wait(until.elementLocated(By.css('input[placeholder="Search algorithms..."]'), 2000));
+
+		// click the new button
+		await driver.findElement(By.css('.dropdown + div > .btn-outline-success')).click();
+		await driver.wait(until.elementLocated(By.css('.modal')), 2000);
+
+		// make new alg
+		const aUser = await driver.findElement(By.css('input[placeholder="Algorithm user..."]'));
+		await aUser.clear();
+		await aUser.sendKeys('selenium');
+		const aName = driver.findElement(By.css('input[placeholder="New algorithm name..."]'));
+		await aName.clear();
+		await aName.sendKeys('iris_preprocessor');
+		await driver.sleep(1000);
+		await driver.findElement(By.css('.modal button.btn-primary')).click();
+		await driver.wait(until.elementLocated(By.linkText('selenium/iris_preprocessor/1')), 2000);
+		await driver.sleep(1000);
+
+		// go to new alg
+		await driver.findElement(By.linkText('selenium/iris_preprocessor/1')).click();
+		await driver.wait(until.elementLocated(By.css('ul.nav-fill.nav.nav-tabs')), 2000);
+
+		// add an input & output
+		await driver.findElement(By.css('#newInputBtn')).click();
+		await driver.findElement(By.css('#newOutputBtn')).click();
+
+		// change input & output name to "measurements"
+		let aiDiv = await driver.findElement(By.css('#newInputBtn')).findElement(By.xpath('..')).findElement(By.css('div:first-child'));
+		let aoDiv = await driver.findElement(By.css('#newOutputBtn')).findElement(By.xpath('..')).findElement(By.css('div:first-child'));
+		let aiName = await aiDiv.findElement(By.css('input'));
+		await aiName.clear();
+		await aiName.sendKeys('measurements');
+		let aoName = await aoDiv.findElement(By.css('input'));
+		await aoName.clear();
+		await aoName.sendKeys('measurements');
+
+		// select type system/array_1d_floats/1
+		await aiDiv.findElement(By.css('select.custom-select')).click();
+		await aiDiv.findElement(By.css('select.custom-select option[value="system/array_1d_floats/1"]')).click();
+		await aoDiv.findElement(By.css('select.custom-select')).click();
+		await aoDiv.findElement(By.css('select.custom-select option[value="system/array_1d_floats/1"]')).click();
+		await driver.sleep(500);
+
+		// save
+		await driver.findElement(By.css('.tab-pane.active > div > div.d-flex > button.btn-outline-secondary')).click();
+		await driver.sleep(1000);
 
 		/**************************************************************
 		 * ADVANCED IRIS EXPERIMENT
 		 */
 
+		// navigate to exp list
+		await driver.findElement(By.linkText('experiments')).click();
+		//.sendKeys('webdriver', Key.RETURN);
+		await driver.wait(until.elementLocated(By.css('input[placeholder="Search experiments..."]'), 2000));
+
+		// click the new button
+		await driver.findElement(By.css('.dropdown + div > .btn-outline-success')).click();
+		await driver.wait(until.elementLocated(By.css('.modal')), 2000);
+
+		// make new exp
+		eUser = await driver.findElement(By.css('input[placeholder="Experiment user..."]'));
+		await eUser.clear();
+		await eUser.sendKeys('selenium');
+		let eTc = await driver.findElement(By.css('.modal select'));
+		await eTc.click();
+		await eTc.findElement(By.css('select option[value="selenium/iris_advanced/1"]')).click();
+		eName = driver.findElement(By.css('input[placeholder="Experiment name..."]'));
+		await eName.clear();
+		await eName.sendKeys('iris');
+		await driver.sleep(1000);
+		await driver.findElement(By.css('.modal button.btn-primary')).click();
+		await driver.wait(until.elementLocated(By.linkText('selenium/selenium/iris_advanced/1/iris')), 2000);
+		await driver.sleep(1000);
+
+		// go to new exp
+		await driver.findElement(By.linkText('selenium/selenium/iris_advanced/1/iris')).click();
+		await driver.wait(until.elementLocated(By.css('div.experimentEditor')), 2000);
+
+		// assign dataset protocol
+		await driver.findElement(By.css('.datasets select')).click();
+		await driver.findElement(By.css(`.datasets select option[value='{"testing_data":{"database":"iris/1","protocol":"Main","set":"training"},"training_data":{"database":"iris/1","protocol":"Main","set":"testing"}}']`)).click();
+
+		// pre_training block
+		await driver.findElement(By.css('rect#block_pre_training')).click();
+		await driver.wait(until.elementLocated(By.css('div.block_pre_training')), 2000);
+		await driver.findElement(By.css('select.custom-select')).click();
+		await driver.findElement(By.css('select.custom-select option[value="selenium/iris_preprocessor/1"]')).click();
+
+		// pre_testing block
+		await driver.findElement(By.css('rect#block_pre_testing')).click();
+		await driver.wait(until.elementLocated(By.css('div.block_pre_testing')), 2000);
+		await driver.findElement(By.css('select.custom-select')).click();
+		await driver.findElement(By.css('select.custom-select option[value="selenium/iris_preprocessor/1"]')).click();
+
+		// training_alg block
+		await driver.findElement(By.css('rect#block_training_alg')).click();
+		await driver.wait(until.elementLocated(By.css('div.block_training_alg')), 2000);
+		await driver.findElement(By.css('select.custom-select')).click();
+		await driver.findElement(By.css('select.custom-select option[value="test/iris_training/1"]')).click();
+
+		// testing_alg block
+		await driver.findElement(By.css('rect#block_testing_alg')).click();
+		await driver.wait(until.elementLocated(By.css('div.block_testing_alg')), 2000);
+		await driver.findElement(By.css('select.custom-select')).click();
+		await driver.findElement(By.css('select.custom-select option[value="test/iris_testing/1"]')).click();
+
+		// analyzer block
+		await driver.findElement(By.css('rect#block_analyzer')).click();
+		await driver.wait(until.elementLocated(By.css('div.block_analyzer')), 2000);
+		await driver.findElement(By.css('select.custom-select')).click();
+		await driver.findElement(By.css('select.custom-select option[value="test/iris_analyzer/1"]')).click();
+
+		// make sure the exp is still valid
+		await driver.wait(until.elementLocated(By.css('.badge-success')), 2000);
+
+		// save exp
+		await driver.findElement(By.css('div.experimentEditor > div.d-flex > button.btn-outline-secondary')).click();
+		await driver.sleep(1000);
+
 		/**************************************************************
 		 * CLEANUP
 		 */
 
+		// go back and delete toolchain (which also deletes the associated experiment)
+		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);
+
+		// go back and delete algorithm
+		await driver.findElement(By.linkText('algorithms')).click();
+		await driver.wait(until.elementLocated(By.css('input[placeholder="Search algorithms..."]'), 2000));
+		tLink = await driver.findElement(By.linkText('selenium/iris_preprocessor/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);
+
 		console.log('selenium tests finished successfully!');
 	} catch(e) {
 		console.log('selenium tests failed!');