diff --git a/seleniumbuilder/chrome/content/html/js/builder/i18n/en.js b/seleniumbuilder/chrome/content/html/js/builder/i18n/en.js index e9b94cd..7fabbd5 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/i18n/en.js +++ b/seleniumbuilder/chrome/content/html/js/builder/i18n/en.js @@ -219,6 +219,7 @@ m.sel2_server_error = "Server Error"; m.sel2_must_playback_in_foreground = "Note: Must leave playback window in foreground during local playback."; m.sel2_eval_failed = "Script evaluation failed."; m.sel2_eval_false = "Eval result \"{0}\" does not match \"{1}\"."; +m.sel2_bypass = "ByPass step \{0}\""; // Step display m.param_expr_info = "
Parameter expressions of the form ${varname} are replaced by the contents of the variable varname"; @@ -288,6 +289,8 @@ m.misc_sel2_cat = "Misc"; m.assertion_sel2_cat = "Assertion"; m.verify_sel2_cat = "Verify"; m.wait_sel2_cat = "Wait"; +m.bypass_sel2_cat = "ByPass"; +m.bookmarklet_sel2_cat = "BookmarkLets"; m.store_sel2_cat = "Store"; // Data-driven diff --git a/seleniumbuilder/chrome/content/html/js/builder/i18n/fr.js b/seleniumbuilder/chrome/content/html/js/builder/i18n/fr.js index 1fa4bc0..c35f494 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/i18n/fr.js +++ b/seleniumbuilder/chrome/content/html/js/builder/i18n/fr.js @@ -219,6 +219,7 @@ m.sel2_server_error = "Erreur serveur"; m.sel2_must_playback_in_foreground = "Remarque: Lors du rejeu, la fenêtre active doit rester au premier plan."; m.sel2_eval_failed = "Echec de l'évaluation."; m.sel2_eval_false = "le résultat de l'évaluation \"{0}\" ne correspond pas à \"{1}\"."; +m.sel2_bypass = "cette étape a été volontairement éludée (\{0}\")"; // Step display m.param_expr_info = "
Parameter expressions of the form ${varname} are replaced by the contents of the variable varname"; @@ -288,6 +289,8 @@ m.misc_sel2_cat = "Autre"; m.assertion_sel2_cat = "Assertion"; m.verify_sel2_cat = "Vérification"; m.wait_sel2_cat = "Attente"; +m.bypass_sel2_cat = "Délestage"; +m.bookmarklet_sel2_cat = "Signapplet"; m.store_sel2_cat = "Affectation"; @@ -313,56 +316,69 @@ m.step_refresh = "Raffraichir la page"; m.step_assertTextPresent = "Vérifier la présence du texte (bloquant)"; m.step_verifyTextPresent = "Vérifier la présence du texte"; m.step_waitForTextPresent = "Attendre la présence du texte"; +m.step_bypassTextPresent = "Delester suite à la présence du texte"; m.step_storeTextPresent = "Affecter la présence du texte"; m.step_assertBodyText = "Vérifier le document (bloquant)"; m.step_verifyBodyText = "Vérifier le document"; m.step_waitForBodyText = "Attendre le document"; +m.step_bypassBodyText = "Délester suite au contenu"; m.step_storeBodyText = "Affecter le document"; m.step_assertElementPresent = "Vérifier la balise (bloquant)"; m.step_verifyElementPresent = "Vérifier la balise"; m.step_waitForElementPresent = "Attendre la balise"; +m.step_bypassElementPresent = "Délestage suite à la balise"; m.step_storeElementPresent = "Affecter la balise"; m.step_assertPageSource = "Vérifier le code source (bloquant)"; m.step_verifyPageSource = "Vérifier le code source"; m.step_waitForPageSource = "Attendre le code source"; +m.step_bypassPageSource = "Délester suite au code source"; m.step_storePageSource = "Affecter le code source"; m.step_assertText = "Vérifier le contenu de la balise (bloquant)"; m.step_verifyText = "Vérifier le contenu de la balise"; m.step_waitForText = "Attendre le contenu de la balise"; +m.step_bypassText = "Délester suite au contenu de la balise"; m.step_storeText = "Affecter le contenu de la balise"; m.step_assertCurrentUrl = "Vérifier l'URL (bloquant)"; m.step_verifyCurrentUrl = "Vérifier l'URL"; -m.step_waitForCurrentUrl = "Attendre la page"; +m.step_waitForCurrentUrl = "Attendre l'URL"; +m.step_bypassCurrentUrl = "Délester suite à l'URL"; m.step_storeCurrentUrl = "Affecter l'URL"; m.step_assertTitle = "Vérifier le titre (bloquant)"; m.step_verifyTitle = "Vérifier le titre"; m.step_waitForTitle = "Attendre le titre"; +m.step_bypassTitle = "Délester suite au titre"; m.step_storeTitle = "Affecter le titre"; m.step_assertElementAttribute = "Vérifier l'attribut d'une balise(bloquant)"; m.step_verifyElementAttribute = "Vérifier l'attribut d'une balise"; m.step_waitForElementAttribute = "Attendre l'attribut d'une balise"; +m.step_bypassElementAttribute = "Délester suite à l'attribut d'une balise"; m.step_storeElementAttribute = "Affecter l'attribut d'une balise"; m.step_assertElementStyle = "Vérifier le style d'une balise(bloquant)"; m.step_verifyElementStyle = "Vérifier le style d'une balise"; m.step_waitForElementStyle = "Attendre le style d'une balise"; +m.step_bypassElementStyle = "Délester suite au style d'une balise"; m.step_storeElementStyle = "Affecter le style d'une balise"; m.step_assertElementSelected = "Vérifier la sélection (bloquant)"; m.step_verifyElementSelected = "Vérifier la sélection"; m.step_waitForElementSelected = "Attendre la sélection"; +m.step_bypassElementSelected = "Délester suite à la sélection"; m.step_storeElementSelected = "Affecter la sélection"; m.step_assertElementValue = "Vérifier la valeur d'un composant (bloquant)"; m.step_verifyElementValue = "Vérifier la valeur d'un composant"; m.step_waitForElementValue = "Attendre la valeur d'un composant"; +m.step_bypassElementValue = "Délester suite à la valeur d'un composant"; m.step_storeElementValue = "Affecter la valeur d'un composant"; m.step_addCookie = "Ajouter un cookie"; m.step_deleteCookie = "Supprimer un cookie"; m.step_assertCookieByName = "Vérifier le contenu du cookie (bloquant)"; m.step_verifyCookieByName = "Vérifier le contenu du cookie"; m.step_waitForCookieByName = "Attendre le contenu du cookie"; +m.step_bypassCookieByName = "Délester suite au contenu du cookie"; m.step_storeCookieByName = "Affecter le contenu du cookie"; m.step_assertCookiePresent = "Vérifier (bloquant)"; m.step_verifyCookiePresent = "Vérifier la présence du cookie"; m.step_waitForCookiePresent = "Attendre la présence du cookie"; +m.step_bypassCookiePresent = "Délester suite à la présence du cookie"; m.step_storeCookiePresent = "Affecter la présence du cookie"; m.step_saveScreenshot = "Effectuer une capture d'écran"; m.step_switchToFrame = "Changer de cadre (FRAME)"; @@ -376,18 +392,28 @@ m.step_pause = "Effectuer une pause"; m.step_assertAlertText = "Vérifier le message d'alerte (bloquant)"; m.step_verifyAlertText = "Vérifier le message d'alerte"; m.step_waitForAlertText = "Attendre le message d'alerte"; +m.step_bypassAlertText = "Délester suite au message d'alerte"; m.step_storeAlertText = "Affecter le message d'alerte"; m.step_assertAlertPresent = "Vérifier la présence d'une alerte (bloquant)"; m.step_verifyAlertPresent = "Vérifier la présence d'une alerte "; m.step_waitForAlertPresent = "Attendre l'affichage d'une alerte "; +m.step_bypassAlertPresent = "Délester suite à l'affichage d'une alerte "; m.step_storeAlertPresent = "Affecter la présence d'une alerte "; m.step_assertEval = "Vérifier le script (bloquant)"; m.step_verifyEval = "Vérifier le script"; m.step_waitForEval = "Attendre la fin du script"; +m.step_bypassEval = "Délester suite à la fin du script"; m.step_storeForEval = "Affecter le résultat du script"; m.step_answerAlert = "Compléter la boite de dialogue"; m.step_acceptAlert = "Acquitter la boite de dialogue"; m.step_dismissAlert = "Répudier la boite de dialogue"; +m.step_printWindowName = "Affiche le nom de la fenêtre courante"; +m.step_renameWindow = "Renommer la fenêtre"; +m.step_forceTargets = "Forcer le nom des fenêtres cibles"; +m.step_deleteComments = "Supprimer les commentaires du code source"; +m.step_deleteCachesUrls = "Supprimer les paramètres de caches des liens"; +m.step_deleteHiddenValues = "Supprimer les données cachées (input[hidden])"; + m.p_attributeName = "Attribut"; m.p_file = "Fichier"; m.p_locator = "Localisation"; diff --git a/seleniumbuilder/chrome/content/html/js/builder/selenium2/docs.js b/seleniumbuilder/chrome/content/html/js/builder/selenium2/docs.js index e0ec426..597f3ff 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/selenium2/docs.js +++ b/seleniumbuilder/chrome/content/html/js/builder/selenium2/docs.js @@ -76,6 +76,10 @@ builder.selenium2.docs = { "params": {"text": "The expected alert text." }, "description": "Wait for an alert showing with the given text." }, + "bypassAlertText": { + "params": {"text": "The expected alert text." ,"nbstep":"number of step to bypass"}, + "description": "bypass n steps that there is an alert showing with the given text." + }, "storeAlertText": { "params": {"variable": "The name of the variable to store the text in." }, "description": "Store the text of the visible alert in the given variable." @@ -92,6 +96,10 @@ builder.selenium2.docs = { "params": {}, "description": "Wait for an alert." }, + "bypassForAlertPresent": { + "params": {"nbstep":"number of step to bypass"}, + "description": "bypass n steps that there is an alert." + }, "storeAlertPresent": { "params": {"variable": "The name of the variable to store in whether an alert is present." }, "description": "Store whether an alert is present in the given variable." @@ -235,6 +243,12 @@ builder.selenium2.docs = { }, "description": "Waits until the current URL is the given value." }, + "bypassCurrentUrl": { + "params": { + "url": "The URL we want to be at." + }, + "description": "Waits until the current URL is the given value." + }, "storeCurrentUrl": { "params": { "variable": "The name of the variable to store the URL in." @@ -259,6 +273,12 @@ builder.selenium2.docs = { }, "description": "Waits for the current page to have the given title." }, + "bypassTitle": { + "params": { + "title": "Title we want the current page to have." + }, + "description": "Waits for the current page to have the given title." + }, "storeTitle": { "params": { "variable": "Name of the variable to store the title into." @@ -286,6 +306,13 @@ builder.selenium2.docs = { }, "description": "Waits for the given element containing exactly the given text." }, + "bypassText": { + "params": { + "locator": "How to find the element whose text to test.", + "text": "The text we want the element to have." + }, + "description": "Waits for the given element containing exactly the given text." + }, "storeText": { "params": { "variable": "The name of the variable to store the element's text in.", @@ -311,6 +338,12 @@ builder.selenium2.docs = { }, "description": "Waits for the given text to appear somewhere on the page." }, + "bypassTextPresent": { + "params": { + "text": "The text we want to feature on the page." + }, + "description": "Waits for the given text to appear somewhere on the page." + }, "storeTextPresent": { "params": { "variable": "The name of the variable to store whether the given text is on the page.", @@ -336,6 +369,12 @@ builder.selenium2.docs = { }, "description": "Waits for the text of the entire page body to be as given." }, + "bypassBodyText": { + "params": { + "text": "The text we want the entire page to be." + }, + "description": "Waits for the text of the entire page body to be as given." + }, "storeBodyText": { "params": { "variable": "The name of the variable to store the page body text in." @@ -360,6 +399,12 @@ builder.selenium2.docs = { }, "description": "Waits for the page source to be as given." }, + "bypassPageSource": { + "params": { + "source": "The expected page source." + }, + "description": "Waits for the page source to be as given." + }, "storePageSource": { "params": { "variable": "The name of the variable to store the page source in." @@ -384,6 +429,12 @@ builder.selenium2.docs = { }, "description": "Waits for an element to exist." }, + "bypassElementPresent": { + "params": { + "locator": "How to find the element." + }, + "description": "Waits for an element to exist." + }, "storeElementPresent": { "params": { "variable": "Name of the variable to store the attribute value in.", @@ -409,6 +460,12 @@ builder.selenium2.docs = { }, "description": "Waits for an element to be selected." }, + "bypassElementSelected": { + "params": { + "locator": "How to find the element." + }, + "description": "Waits for an element to be selected." + }, "storeElementSelected": { "params": { "variable": "Name of the variable to store the attribute value in.", @@ -440,6 +497,14 @@ builder.selenium2.docs = { }, "description": "Waits for an element's attribute to assume a specific value." }, + "bypassElementAttribute": { + "params": { + "locator": "How to find the element.", + "attributeName": "The name of the attribute to check.", + "value": "The value we want the attribute to have." + }, + "description": "Waits for an element's attribute to assume a specific value." + }, "storeElementAttribute": { "params": { "variable": "Name of the variable to store the attribute value in.", @@ -472,6 +537,14 @@ builder.selenium2.docs = { }, "description": "Waits for an element's CSS style property to assume a specific value." }, + "bypassElementStyle": { + "params": { + "locator": "How to find the element.", + "propertyName": "The name of the CSS style property to check.", + "value": "The value we want the property to have." + }, + "description": "Waits for an element's CSS style property to assume a specific value." + }, "storeElementStyle": { "params": { "variable": "Name of the variable to store the property value in.", @@ -501,6 +574,13 @@ builder.selenium2.docs = { }, "description": "Waits for an element's value to become the given one." }, + "bypassElementValue": { + "params": { + "locator": "How to find the element.", + "value": "The value we want the element to have." + }, + "description": "Waits for an element's value to become the given one." + }, "storeElementValue": { "params": { "variable": "The name of the variable to store the element's value in.", @@ -526,6 +606,12 @@ builder.selenium2.docs = { }, "description": "Waits for a cookie with the given name to be present." }, + "bypassCookiePresent": { + "params": { + "name": "The cookie's name." + }, + "description": "Waits for a cookie with the given name to be present." + }, "storeCookiePresent": { "params": { "variable": "The name of the variable where to store whether the cookie exists.", @@ -554,6 +640,13 @@ builder.selenium2.docs = { }, "description": "Waits for a cookie with the given name and value to be present." }, + "bypassCookieByName": { + "params": { + "name": "The cookie's name.", + "value": "The value (content) the cookie is expected to have." + }, + "description": "Waits for a cookie with the given name and value to be present." + }, "storeCookieByName": { "params": { "variable": "The name of the variable to store the cookie's value in.", @@ -582,12 +675,43 @@ builder.selenium2.docs = { }, "description": "Waits for the given script to evaluate to the given value. Use 'return' to return the result of the evaluation, e.g. 'return 3'." }, + "bypassEval": { + "params": { + "script": "A JavaScript expression to be evaluated.", + "value": "The value the script is expected to evaluate to." + }, + "description": "Waits for the given script to evaluate to the given value. Use 'return' to return the result of the evaluation, e.g. 'return 3'." + }, "storeEval": { "params": { "variable": "The name of the variable to store evaluation result in.", "script": "A JavaScript expression to be evaluated. Use 'return' to return the result of the evaluation, e.g. 'return 3'." }, "description": "Evaluates a JavaScript expression and stores the result in a variable." + }, + "printWindowName": { + "description": "Print out the currrent window name." + }, + "renameWindow": { + "params" : { + "name": "a current window new name" + }, + "description": "Name or Rename the current window DOM object." + }, + "forceTargets": { + "params" : { + "name": "a target value or framename (current value:\"_blank\",\"_self\",\"_parent\",\"_top\",...)" + }, + "description": "force all links to specifie name to linked document (href and open)" + }, + "deleteComments": { + "description": "delete all comments of the html structure" + }, + "deleteCachesUrls": { + "description": "delete all params of urls image / css / js" + }, + "deleteHiddenValues": { + "description": "delete data value of hidden input tags" } }; diff --git a/seleniumbuilder/chrome/content/html/js/builder/selenium2/io/io.js b/seleniumbuilder/chrome/content/html/js/builder/selenium2/io/io.js index 563e4ae..2f1178b 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/selenium2/io/io.js +++ b/seleniumbuilder/chrome/content/html/js/builder/selenium2/io/io.js @@ -235,7 +235,7 @@ builder.selenium2.io.canExport = function(lang_info, stepType) { if (!lang_info.getters || !lang_info.boolean_getters) { return false; } var booleanVersion = false; for (var b = 0; b < 2; b++) { - var stepFlavors = ["assert", "verify", "waitFor", "store"]; + var stepFlavors = ["assert", "verify", "waitFor", "bypass", "store"]; for (var f = 0; f < stepFlavors.length; f++) { var flavor_key = (booleanVersion ? "boolean_" : "") + stepFlavors[f]; if (stepType.name.startsWith(stepFlavors[f]) && lang_info[flavor_key] !== undefined) { @@ -280,7 +280,7 @@ builder.selenium2.io.createLangFormatter = function(lang_info) { } else { var booleanVersion = false; for (var b = 0; b < 2; b++) { - var stepFlavors = ["assert", "verify", "waitFor", "store"]; + var stepFlavors = ["assert", "verify", "waitFor", "bypass", "store"]; for (var f = 0; f < stepFlavors.length; f++) { var flavor_key = (booleanVersion ? "boolean_" : "") + stepFlavors[f]; if (step.type.name.startsWith(stepFlavors[f]) && lang_info[flavor_key] !== undefined) { diff --git a/seleniumbuilder/chrome/content/html/js/builder/selenium2/playback.js b/seleniumbuilder/chrome/content/html/js/builder/selenium2/playback.js index 47ef663..01be16f 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/selenium2/playback.js +++ b/seleniumbuilder/chrome/content/html/js/builder/selenium2/playback.js @@ -36,6 +36,8 @@ builder.selenium2.playback.implicitWaitCycle = 0; builder.selenium2.playback.implicitWaitTimeout = null; /** The session start timeout. */ builder.selenium2.playback.sessionStartTimeout = null; +/** The bypass decrement. */ +builder.selenium2.playback.byPassCounter = 0; /** The pause incrementor. */ builder.selenium2.playback.pauseCounter = 0; /** The pause interval. */ @@ -511,6 +513,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassTextPresent": function() { + builder.selenium2.playback.findElement({type: 'tag name', value: 'body'}, function(result) { + builder.selenium2.playback.execute('getElementText', {id: result.value.ELEMENT}, function(result) { + if (result.value.indexOf(builder.selenium2.playback.param("text")) != -1) { + builder.selenium2.playback.recordResult({success: true}); + }/* else { + builder.selenium2.playback.recordError(_t('sel2_text_not_present', builder.selenium2.playback.param("text"))); + }*/ + }); + }); + }, "storeTextPresent": function() { builder.selenium2.playback.findElement({type: 'tag name', value: 'body'}, function(result) { builder.selenium2.playback.execute('getElementText', {id: result.value.ELEMENT}, function(result) { @@ -551,6 +564,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassBodyText": function() { + builder.selenium2.playback.findElement({type: 'tag name', value: 'body'}, function(result) { + builder.selenium2.playback.execute('getElementText', {id: result.value.ELEMENT}, function(result) { + if (result.value == builder.selenium2.playback.param("text")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_body_text_does_not_match', builder.selenium2.playback.param("text"))}); + } + }); + }); + }, "storeBodyText": function() { builder.selenium2.playback.findElement({type: 'tag name', value: 'body'}, function(result) { builder.selenium2.playback.execute('getElementText', {id: result.value.ELEMENT}, function(result) { @@ -578,6 +602,11 @@ builder.selenium2.playback.playbackFunctions = { ); }); }, + "bypassElementPresent": function() { + builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), null, function(result) { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_element_not_found')}); + }); + }, "storeElementPresent": function() { builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), /*success*/ @@ -617,6 +646,15 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassyPageSource": function() { + builder.selenium2.playback.execute('getPageSource', {}, function(result) { + if (result.value == builder.selenium2.playback.param("source")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_source_does_not_match')}); + } + }); + }, "storePageSource": function() { builder.selenium2.playback.execute('getPageSource', {}, function(result) { builder.selenium2.playback.vars[builder.selenium2.playback.param("variable")] = result.value; @@ -655,6 +693,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassText": function() { + builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { + builder.selenium2.playback.execute('getElementText', {id: result.value.ELEMENT}, function(result) { + if (result.value == builder.selenium2.playback.param("text")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_element_text_does_not_match', result.value, builder.selenium2.playback.param("text"))}); + } + }); + }); + }, "storeText": function() { builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { builder.selenium2.playback.execute('getElementText', {id: result.value.ELEMENT}, function(result) { @@ -689,6 +738,15 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassCurrentUrl": function() { + builder.selenium2.playback.execute('getCurrentUrl', {}, function(result) { + if (result.value == builder.selenium2.playback.param("url")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_url_does_not_match', result.value, builder.selenium2.playback.param("url"))}); + } + }); + }, "storeCurrentUrl": function() { builder.selenium2.playback.execute('getCurrentUrl', {}, function(result) { builder.selenium2.playback.vars[builder.selenium2.playback.param("variable")] = result.value; @@ -721,6 +779,15 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassTitle": function() { + builder.selenium2.playback.execute('getTitle', {}, function(result) { + if (result.value == builder.selenium2.playback.param("title")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_title_does_not_match', result.value, builder.selenium2.playback.param("title"))}); + } + }); + }, "storeTitle": function() { builder.selenium2.playback.execute('getTitle', {}, function(result) { builder.selenium2.playback.vars[builder.selenium2.playback.param("variable")] = result.value; @@ -759,6 +826,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassElementSelected": function() { + builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { + builder.selenium2.playback.execute('isElementSelected', {id: result.value.ELEMENT}, function(result) { + if (result.value) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_element_not_selected')}); + } + }); + }); + }, "storeElementSelected": function() { builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { builder.selenium2.playback.execute('isElementSelected', {id: result.value.ELEMENT}, function(result) { @@ -799,6 +877,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassElementValue": function() { + builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { + builder.selenium2.playback.execute('getElementAttribute', {id: result.value.ELEMENT, name: 'value'}, function(result) { + if (result.value == builder.selenium2.playback.param("value")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_element_value_doesnt_match', result.value, builder.selenium2.playback.param("value"))}); + } + }); + }); + }, "storeElementValue": function() { builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { builder.selenium2.playback.execute('getElementAttribute', {id: result.value.ELEMENT, name: 'value'}, function(result) { @@ -839,6 +928,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassElementAttribute": function() { + builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { + builder.selenium2.playback.execute('getElementAttribute', {id: result.value.ELEMENT, name: builder.selenium2.playback.param("attributeName") }, function(result) { + if (result.value == builder.selenium2.playback.param("value")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_attribute_value_doesnt_match', builder.selenium2.playback.param("attributeName"), result.value, builder.selenium2.playback.param("value"))}); + } + }); + }); + }, "storeElementAttribute": function() { builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { builder.selenium2.playback.execute('getElementAttribute', {id: result.value.ELEMENT, name: builder.selenium2.playback.param("attributeName") }, function(result) { @@ -879,6 +979,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassElementStyle": function() { + builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { + builder.selenium2.playback.execute('getElementValueOfCssProperty', {id: result.value.ELEMENT, propertyName: builder.selenium2.playback.param("propertyName") }, function(result) { + if (result.value == builder.selenium2.playback.param("value")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_css_value_doesnt_match', builder.selenium2.playback.param("propertyName"), result.value, builder.selenium2.playback.param("value"))}); + } + }); + }); + }, "storeElementStyle": function() { builder.selenium2.playback.findElement(builder.selenium2.playback.param("locator"), function(result) { builder.selenium2.playback.execute('getElementValueOfCssProperty', {id: result.value.ELEMENT, propertyName: builder.selenium2.playback.param("propertyName") }, function(result) { @@ -952,6 +1063,21 @@ builder.selenium2.playback.playbackFunctions = { /*error*/ function() { callback(false); }); }); }, + "bypassCookieByName": function() { + builder.selenium2.playback.execute('getCookies', {}, function(result) { + for (var i = 0; i < result.value.length; i++) { + if (result.value[i].name == builder.selenium2.playback.param("name")) { + if (result.value[i].value == builder.selenium2.playback.param("value")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_cookie_value_doesnt_match', builder.selenium2.playback.param("name"), result.value[i].value, builder.selenium2.playback.param("value"))}); + } + return; + } + } + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_no_cookie_found', builder.selenium2.playback.param("name"))}); + }); + }, "storeCookieByName": function() { builder.selenium2.playback.execute('getCookies', {}, function(result) { for (var i = 0; i < result.value.length; i++) { @@ -1001,6 +1127,17 @@ builder.selenium2.playback.playbackFunctions = { /*error*/ function() { callback(false); }); }); }, + "bypassCookiePresent": function() { + builder.selenium2.playback.execute('getCookies', {}, function(result) { + for (var i = 0; i < result.value.length; i++) { + if (result.value[i].name == builder.selenium2.playback.param("name")) { + builder.selenium2.playback.recordResult({success: true}); + return; + } + } + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_no_cookie_found', builder.selenium2.playback.param("name"))}); + }); + }, "storeCookiePresent": function() { builder.selenium2.playback.execute('getCookies', {}, function(result) { for (var i = 0; i < result.value.length; i++) { @@ -1064,6 +1201,15 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassAlertText": function() { + builder.selenium2.playback.execute('getAlertText', {}, function(result) { + if (result.value == builder.selenium2.playback.param("text")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_alert_text_does_not_match', result.value, builder.selenium2.playback.param("text"))}); + } + }); + }, "storeAlertText": function() { builder.selenium2.playback.execute('getAlertText', {}, function(result) { builder.selenium2.playback.vars[builder.selenium2.playback.param("variable")] = result.value; @@ -1092,6 +1238,13 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassAlertPresent": function() { + builder.selenium2.playback.execute('getAlert', {}, function(result) { + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_no_alert_present')}); + }); + }, "storeAlertPresent": function() { builder.selenium2.playback.execute('getAlert', {}, function(result) { builder.selenium2.playback.vars[builder.selenium2.playback.param("variable")] = true; @@ -1147,6 +1300,17 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { callback(false); }); }); }, + "bypassEval": function() { + builder.selenium2.playback.execute('executeScript', { 'script': builder.selenium2.playback.param("script"), 'args': [] }, function(result) { + if (str(result.value) == builder.selenium2.playback.param("value")) { + builder.selenium2.playback.recordResult({success: true}); + } else { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_eval_false', result.value, builder.selenium2.playback.param("value"))}); + } + }, /*error*/ function() { + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_eval_failed')}); + }); + }, "storeEval": function() { builder.selenium2.playback.execute('executeScript', { 'script': builder.selenium2.playback.param("script"), 'args': [] }, function(result) { builder.selenium2.playback.vars[builder.selenium2.playback.param("variable")] = str(result.value); @@ -1154,19 +1318,66 @@ builder.selenium2.playback.playbackFunctions = { }, /*error*/ function() { builder.selenium2.playback.recordError(_t('sel2_eval_failed')); }); + }, + "printWindowName": function() { + builder.selenium2.playback.execute('executeScript', { 'script': 'return window.name;', 'args': [] }, function(result) { + builder.selenium2.playback.print(str(result.value)); + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordError(_t('sel2_eval_failed')); + }); + }, + "renameWindow": function() { + builder.selenium2.playback.execute('executeScript', { 'script': 'return (window.name="'+builder.selenium2.playback.param("name")+'");', 'args': [] }, function(result) { + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordError(_t('sel2_eval_failed')); + }); + }, + "forceTargets": function() { + builder.selenium2.playback.execute('executeScript', { 'script': 'var a=document.querySelectorAll("a[href]");[].forEach.call(a,function(e){e.setAttribute("target","'+builder.selenium2.playback.param("name")+'");});return 1;', 'args': [] }, function(result) { + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordError(_t('sel2_eval_failed')); + }); + }, + "deleteComments": function() { + builder.selenium2.playback.execute('executeScript', { 'script': 'var t=document.createTreeWalker(document.documentElement,NodeFilter.SHOW_COMMENT, null, false),c=[];while(t.nextNode()){c.push(t.currentNode);}[].forEach.call(c,function(e){e.parentNode.removeChild(e);});return 1;', 'args': [] }, function(result) { + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordError(_t('sel2_eval_failed')); + }); + }, + "deleteCachesUrls": function() { + builder.selenium2.playback.execute('executeScript', { 'script': "var a=document.querySelectorAll('link[href*=\"?\"],img[src*=\"?\"],script[src*=\"?\"]');[].forEach.call(a,function(e){var a=e.href||e.src;var b =a.substr(0,a.indexOf('\\?'));(e.src)?e.src=b:e.href=b;});return 1;", 'args': [] }, function(result) { + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordError(_t('sel2_eval_failed')); + }); + }, + "deleteHiddenValues": function() { + builder.selenium2.playback.execute('executeScript', { 'script': "var a=document.querySelectorAll('input[type=\"hidden\"]');[].forEach.call(a,function(e){a.parentNode.removeChild(a);});return 1;", 'args': [] }, function(result) { + builder.selenium2.playback.recordResult({success: true}); + }, /*error*/ function() { + builder.selenium2.playback.recordError(_t('sel2_eval_failed')); + }); } }; builder.selenium2.playback.playStep = function() { builder.selenium2.playback.stepStateCallback(builder.selenium2.playback, builder.selenium2.playback.script, builder.selenium2.playback.currentStep, builder.selenium2.playback.currentStepIndex(), builder.stepdisplay.state.RUNNING, null, null); - if (builder.selenium2.playback.playbackFunctions[builder.selenium2.playback.currentStep.type.getName()]) { - try { - builder.selenium2.playback.playbackFunctions[builder.selenium2.playback.currentStep.type.getName()](); - } catch (e) { - builder.selenium2.playback.recordError(e); + if (builder.selenium2.playback.byPassCounter === 0){ + if (builder.selenium2.playback.playbackFunctions[builder.selenium2.playback.currentStep.type.getName()]) { + try { + builder.selenium2.playback.playbackFunctions[builder.selenium2.playback.currentStep.type.getName()](); + } catch (e) { + builder.selenium2.playback.recordError(e); + } + } else { + builder.selenium2.playback.recordError(_t('sel2_step_not_implemented_for_playback', builder.selenium2.playback.currentStep.type)); } } else { - builder.selenium2.playback.recordError(_t('sel2_step_not_implemented_for_playback', builder.selenium2.playback.currentStep.type)); + builder.selenium2.playback.recordResult({success: false, message: _t('sel2_bypass', builder.selenium2.playback.byPassCounter--), skip: true}); } }; @@ -1175,6 +1386,7 @@ builder.selenium2.playback.print = function(text) { }; builder.selenium2.playback.recordResult = function(result) { + if (builder.selenium2.playback.currentStep.negated) { var msg = builder.selenium2.playback.currentStep.type.getName() + " " + _t('sel2_is') + " " + _t('sel2_' + result.success); if (result.success && builder.selenium2.playback.currentStep.type.getName().startsWith("assert")) { @@ -1184,13 +1396,22 @@ builder.selenium2.playback.recordResult = function(result) { result.message = msg; result.success = !result.success; } - if (result.success) { + if (result.skip) { + // Skipped steps should be updated with a distinct UI treatment + builder.selenium2.playback.stepStateCallback(builder.selenium2.playback, builder.selenium2.playback.script, builder.selenium2.playback.currentStep, builder.selenium2.playback.currentStepIndex(), builder.stepdisplay.state.SKIPPED, null, null); + } else if (result.success) { builder.selenium2.playback.stepStateCallback(builder.selenium2.playback, builder.selenium2.playback.script, builder.selenium2.playback.currentStep, builder.selenium2.playback.currentStepIndex(), builder.stepdisplay.state.SUCCEEDED, null, null); + if (result.success && builder.selenium2.playback.currentStep.type.getName().startsWith("bypass")) { + builder.selenium2.playback.byPassCounter = builder.selenium2.playback.currentStep.nbstep; + } } else { + // Bypass steps are not real failures, but we're setting the display to "FAILED" so it's more obvious when Se-Builder runs/skips the bypassable steps builder.selenium2.playback.stepStateCallback(builder.selenium2.playback, builder.selenium2.playback.script, builder.selenium2.playback.currentStep, builder.selenium2.playback.currentStepIndex(), builder.stepdisplay.state.FAILED, null, result.message); - builder.selenium2.playback.playResult.success = false; - if (result.message) { - builder.selenium2.playback.playResult.errormessage = result.message; + if (!builder.selenium2.playback.currentStep.type.getName().startsWith("bypass")) { + builder.selenium2.playback.playResult.success = false; + if (result.message) { + builder.selenium2.playback.playResult.errormessage = result.message; + } } } diff --git a/seleniumbuilder/chrome/content/html/js/builder/selenium2/selenium2.js b/seleniumbuilder/chrome/content/html/js/builder/selenium2/selenium2.js index 411c980..ac49ff8 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/selenium2/selenium2.js +++ b/seleniumbuilder/chrome/content/html/js/builder/selenium2/selenium2.js @@ -27,6 +27,7 @@ builder.selenium2.StepType.prototype = { getNegatable: function() { return this.name.startsWith("waitFor") || this.name.startsWith("assert") || + this.name.startsWith("bypass") || this.name.startsWith("verify"); }, /** @return The note text for this step type, if any. */ @@ -56,56 +57,69 @@ builder.selenium2.__stepData = { "assertTextPresent": ["text"], "verifyTextPresent": ["text"], "waitForTextPresent": ["text"], + "bypassTextPresent": ["text","nbstep"], "storeTextPresent": ["text", "variable"], "assertBodyText": ["text"], "verifyBodyText": ["text"], "waitForBodyText": ["text"], + "bypassBodyText": ["text","nbstep"], "storeBodyText": ["variable"], "assertElementPresent": ["locator"], "verifyElementPresent": ["locator"], "waitForElementPresent": ["locator"], + "bypassElementPresent": ["locator","nbstep"], "storeElementPresent": ["locator", "variable"], "assertPageSource": ["source"], "verifyPageSource": ["source"], "waitForPageSource": ["source"], + "bypassPageSource": ["source","nbstep"], "storePageSource": ["variable"], "assertText": ["locator", "text"], "verifyText": ["locator", "text"], "waitForText": ["locator", "text"], + "bypassText": ["locator", "text", "nbstep"], "storeText": ["locator", "variable"], "assertCurrentUrl": ["url"], "verifyCurrentUrl": ["url"], "waitForCurrentUrl": ["url"], + "bypassCurrentUrl": ["url", "nbstep"], "storeCurrentUrl": ["variable"], "assertTitle": ["title"], "verifyTitle": ["title"], "waitForTitle": ["title"], + "bypassTitle": ["title", "nbstep"], "storeTitle": ["variable"], "assertElementAttribute": ["locator", "attributeName", "value"], "verifyElementAttribute": ["locator", "attributeName", "value"], "waitForElementAttribute": ["locator", "attributeName", "value"], + "bypassElementAttribute": ["locator", "attributeName", "value", "nbstep"], "storeElementAttribute": ["locator", "attributeName", "variable"], "assertElementStyle": ["locator", "propertyName", "value"], "verifyElementStyle": ["locator", "propertyName", "value"], "waitForElementStyle": ["locator", "propertyName", "value"], + "bypassElementStyle": ["locator", "propertyName", "value", "nbstep"], "storeElementStyle": ["locator", "propertyName", "variable"], "assertElementSelected": ["locator"], "verifyElementSelected": ["locator"], "waitForElementSelected": ["locator"], + "bypassElementSelected": ["locator", "nbstep"], "storeElementSelected": ["locator", "variable"], "assertElementValue": ["locator", "value"], "verifyElementValue": ["locator", "value"], "waitForElementValue": ["locator", "value"], + "bypassElementValue": ["locator", "value", "nbstep"], "storeElementValue": ["locator", "variable"], "addCookie": ["name", "value", "options"], "deleteCookie": ["name"], "assertCookieByName": ["name", "value"], "verifyCookieByName": ["name", "value"], "waitForCookieByName": ["name", "value"], + "bypassCookieByName": ["name", "value", "nbstep"], "storeCookieByName": ["name", "variable"], "assertCookiePresent": ["name"], "verifyCookiePresent": ["name"], "waitForCookiePresent": ["name"], + "bypassCookiePresent": ["name", "nbstep"], "storeCookiePresent": ["name", "variable"], "saveScreenshot": ["file"], "print": ["text"], @@ -119,10 +133,12 @@ builder.selenium2.__stepData = { "assertAlertText": ["text"], "verifyAlertText": ["text"], "waitForAlertText": ["text"], + "bypassAlertText": ["text","nbstep"], "storeAlertText": ["variable"], "assertAlertPresent": [], "verifyAlertPresent": [], "waitForAlertPresent": [], + "bypassAlertPresent": ["nbstep"], "storeAlertPresent": ["variable"], "answerAlert": ["text"], "acceptAlert": [], @@ -130,8 +146,17 @@ builder.selenium2.__stepData = { "assertEval": ["script", "value"], "verifyEval": ["script", "value"], "waitForEval": ["script", "value"], + "bypassEval": ["script", "value", "nbstep"], "storeEval": ["script", "variable"], - "setWindowSize": ["width", "height"] + "setWindowSize": ["width", "height"], + "printWindowName": [], + "renameWindow": ["name"], + "forceTargets": ["name"], + "deleteComments": [], + "deleteCachesUrls": [], + "deleteHiddenValues": [] + //"maximizeWindow": + //"download": }; builder.selenium2.__stepNotes = { @@ -207,7 +232,7 @@ builder.selenium2.categories = [ builder.selenium2.stepTypes.assertElementPresent, builder.selenium2.stepTypes.assertElementSelected, builder.selenium2.stepTypes.assertElementAttribute, - builder.selenium2.stepTypes.assertElementStyle, + builder.selenium2.stepTypes.assertElementStyle, builder.selenium2.stepTypes.assertElementValue, builder.selenium2.stepTypes.assertCookiePresent, builder.selenium2.stepTypes.assertCookieByName, @@ -225,7 +250,7 @@ builder.selenium2.categories = [ builder.selenium2.stepTypes.verifyElementPresent, builder.selenium2.stepTypes.verifyElementSelected, builder.selenium2.stepTypes.verifyElementAttribute, - builder.selenium2.stepTypes.verifyElementStyle, + builder.selenium2.stepTypes.verifyElementStyle, builder.selenium2.stepTypes.verifyElementValue, builder.selenium2.stepTypes.verifyCookiePresent, builder.selenium2.stepTypes.verifyCookieByName, @@ -243,7 +268,7 @@ builder.selenium2.categories = [ builder.selenium2.stepTypes.waitForElementPresent, builder.selenium2.stepTypes.waitForElementSelected, builder.selenium2.stepTypes.waitForElementAttribute, - builder.selenium2.stepTypes.waitForElementStyle, + builder.selenium2.stepTypes.waitForElementStyle, builder.selenium2.stepTypes.waitForElementValue, builder.selenium2.stepTypes.waitForCookiePresent, builder.selenium2.stepTypes.waitForCookieByName, @@ -251,6 +276,24 @@ builder.selenium2.categories = [ builder.selenium2.stepTypes.waitForAlertPresent, builder.selenium2.stepTypes.waitForEval ]], + [_t('bypass_sel2_cat'), [ + builder.selenium2.stepTypes.bypassCurrentUrl, + builder.selenium2.stepTypes.bypassTitle, + builder.selenium2.stepTypes.bypassText, + builder.selenium2.stepTypes.bypassTextPresent, + builder.selenium2.stepTypes.bypassBodyText, + builder.selenium2.stepTypes.bypassPageSource, + builder.selenium2.stepTypes.bypassElementPresent, + builder.selenium2.stepTypes.bypassElementSelected, + builder.selenium2.stepTypes.bypassElementAttribute, + builder.selenium2.stepTypes.bypassElementStyle, + builder.selenium2.stepTypes.bypassElementValue, + builder.selenium2.stepTypes.bypassCookiePresent, + builder.selenium2.stepTypes.bypassCookieByName, + builder.selenium2.stepTypes.bypassAlertText, + builder.selenium2.stepTypes.bypassAlertPresent, + builder.selenium2.stepTypes.bypassEval + ]], [_t('store_sel2_cat'), [ builder.selenium2.stepTypes.store, builder.selenium2.stepTypes.storeCurrentUrl, @@ -261,13 +304,21 @@ builder.selenium2.categories = [ builder.selenium2.stepTypes.storePageSource, builder.selenium2.stepTypes.storeElementSelected, builder.selenium2.stepTypes.storeElementAttribute, - builder.selenium2.stepTypes.storeElementStyle, + builder.selenium2.stepTypes.storeElementStyle, builder.selenium2.stepTypes.storeElementValue, builder.selenium2.stepTypes.storeCookiePresent, builder.selenium2.stepTypes.storeCookieByName, builder.selenium2.stepTypes.storeAlertText, builder.selenium2.stepTypes.storeAlertPresent, builder.selenium2.stepTypes.storeEval + ]], + [_t('bookmarklet_sel2_cat'), [ + builder.selenium2.stepTypes.printWindowName, + builder.selenium2.stepTypes.renameWindow, + builder.selenium2.stepTypes.forceTargets, + builder.selenium2.stepTypes.deleteComments, + builder.selenium2.stepTypes.deleteCachesUrls, + builder.selenium2.stepTypes.deleteHiddenValues ]] ]; diff --git a/seleniumbuilder/chrome/content/html/js/builder/stepdisplay.js b/seleniumbuilder/chrome/content/html/js/builder/stepdisplay.js index 8a9e51c..e9bf74d 100644 --- a/seleniumbuilder/chrome/content/html/js/builder/stepdisplay.js +++ b/seleniumbuilder/chrome/content/html/js/builder/stepdisplay.js @@ -8,6 +8,7 @@ builder.stepdisplay.state.SUCCEEDED = 2; builder.stepdisplay.state.FAILED = 3; builder.stepdisplay.state.ERROR = 4; builder.stepdisplay.state.BREAKPOINT = 5; +builder.stepdisplay.state.SKIPPED = 6; builder.stepdisplay.stateColors = {}; builder.stepdisplay.stateColors[builder.stepdisplay.state.NORMAL] = 'white'; @@ -16,6 +17,7 @@ builder.stepdisplay.stateColors[builder.stepdisplay.state.SUCCEEDED] = '#bfee85' builder.stepdisplay.stateColors[builder.stepdisplay.state.FAILED] = '#ffcccc'; builder.stepdisplay.stateColors[builder.stepdisplay.state.ERROR] = '#ff3333'; builder.stepdisplay.stateColors[builder.stepdisplay.state.BREAKPOINT] = '#e0d5e9'; +builder.stepdisplay.stateColors[builder.stepdisplay.state.SKIPPED] = '#ffc048'; builder.registerPostLoadHook(function() { jQuery('#suite-saverequired').text(_t('suite_has_unsaved_changes')); @@ -465,7 +467,7 @@ function mkUpdate(stepID, newType) { } function baseTypeName(type) { - return type.getName().replace(/^(store|assert|verify|waitFor)/, ""); + return type.getName().replace(/^(store|assert|verify|bypass|waitFor)/, ""); } function mkCatUpdate(stepID, newCat) {