tag tab style change attribute javascript selenium selenium-webdriver protractor end-to-end

javascript - tab - title html



Obtener el texto seleccionado actualmente (1)

getSelection no funciona para texto seleccionado en elementos de input , sino para selecciones realizadas en elementos de la página.

Puede usar selectionStart y selectionEnd como este:

return document.activeElement.value.substring( document.activeElement.selectionStart, document.activeElement.selectionEnd)

Probablemente deberías crear una función para esto en lugar de este delineador. Y tal vez quiera probar también si document.activeElement es realmente el tipo correcto de elemento, etc. Y cuando lo haga, incluso podría hacerlo compatible con navegadores anteriores a IE9 ... ( aunque difícil )

Función simple

Esto funcionará también en controles de input o de área de textarea que no tienen foco:

function getInputSelection(el) { if (el.selectionStart !== undefined) { return el.value.substring(el.selectionStart, el.selectionEnd); } } // Example call: console.log(getInputSelection(document.activeElement));

Extenso jQuery Plug-in

Esto proporciona una mayor compatibilidad entre navegadores (anterior a IE9 ) y admite no solo obtener, sino también establecer el rango de selección y el texto, en forma de un complemento de jQuery . Se trata del hecho de que las secuencias de caracteres CRLF se cuentan como una posición de carácter de una manera pragmática (sustitúyase in situ por LF únicamente):

/** * jQuery plug-in for getting/setting the selection range and text * within input/textarea element(s). When the selection is set, * the element will receive focus. When getting the selection, * some browsers require the element to have focus (IE8 and below). * It is up to the caller to set the focus first, if so needed. * @this {jQuery} Input/textarea element(s). * @param {object} opt_bounds When provided, it sets the range as follows: * @param {number} opt_bounds.start Optional start of the range. If not * provided, the start point of the range is not altered. * @param {number} opt_bounds.end Optional end of the range. If not * provided, the end point of the range is not altered. If null, the end * of the text value is assumed. * @param {number} opt_bounds.text Optional text to put in the range. If * not provided, no change will be made to the range''s text. * @return {jQuery|object|undefined} When setting: the same as @this to * allow chaining, when getting, an object {start, end, text, length} * representing the selection in the first element if that info * is available, undefined otherwise. */ $.fn.selection = function (opt_bounds) { var bounds, inputRange, input, docRange, value; function removeCR(s) { // CRLF counts as one unit in text box, so replace with 1 char // for correct offsetting return s.replace(//r/n/g, ''/n''); } if (opt_bounds === undefined) { // Get if (!this.length) { return; } bounds = {}; input = this[0]; if (input.setSelectionRange) { // Modern browsers bounds.start = input.selectionStart; bounds.end = input.selectionEnd; } else { // Check browser support if (!document.selection || !document.selection.createRange) { return; } // IE8 or older docRange = document.selection.createRange(); // Selection must be confined to input only if (!docRange || docRange.parentElement() !== input) { return; } // Create another range that can only extend within the // input boundaries. inputRange = input.createTextRange(); inputRange.moveToBookmark(docRange.getBookmark()); // Measure how many characters we can go back within the input: bounds.start = -inputRange.moveStart(''character'', -input.value.length); bounds.end = -inputRange.moveEnd(''character'', -input.value.length); } // Add properties: bounds.length = bounds.end - bounds.start; bounds.text = removeCR(input.value). substr(bounds.start, bounds.length); return bounds; } // Set if (opt_bounds.text !== undefined) { opt_bounds.text = removeCR(opt_bounds.text); } return this.each(function () { bounds = $.extend($(this).selection(), opt_bounds); bounds.end = bounds.end === null ? this.value.length : bounds.end; if (opt_bounds.text !== undefined) { value = removeCR(this.value); this.value = value.substr(0, bounds.start) + bounds.text + value.substr(bounds.end); bounds.end = bounds.start + bounds.text.length; } if (this.setSelectionRange) { // Modern browsers // Call .focus() to align with IE8 behaviour. // You can leave that out if you don''t care about that. this.focus(); this.setSelectionRange(bounds.start, bounds.end); } else if (this.createTextRange) { // IE8 and before inputRange = this.createTextRange(); inputRange.collapse(true); inputRange.moveEnd(''character'', bounds.end); inputRange.moveStart(''character'', bounds.start); // .select() will also focus the element: inputRange.select(); } }); };

Ejemplo de uso:

// Get console.log($(''textarea'').selection().text); // Set text $(''textarea'').selection({text: "Hello!"}); // Set starting point of selection $(''textarea'').selection({start: 1});

Intento obtener el texto seleccionado actualmente en una entrada usando window.getSelection() pero siempre window.getSelection() una cadena vacía:

expect(browser.executeScript("return window.getSelection().toString();")).toEqual("test");

Resultados en:

Expected '''' to equal ''test''.

La prueba reproducible completa que utiliza angularjs.org como sitio de destino:

describe("My test", function () { beforeEach(function () { browser.get("https://angularjs.org/"); }); it("should select text in an input", function () { var query = element(by.css("input.search-query")); query.sendKeys("test"); query.sendKeys(protractor.Key.chord(protractor.Key.COMMAND, "a")); expect(browser.executeScript("return window.getSelection().toString();")).toEqual("test"); }); });

Tenga en cuenta que realmente veo que el texto ingresado se selecciona con COMMAND + "a".

¿Qué estoy haciendo mal?

Usando el transportador 2.5.1, firefox 41.