Огурец + капибара + селен: выделение текста - PullRequest
4 голосов
/ 17 декабря 2010

Я делаю изменения в текстовом редакторе, и мне нужно иметь возможность выбирать текст, чтобы манипулировать им с помощью JavaScript. Как выбрать текст с огурцом, капибарой и селеном?

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Я обнаружил еще один вопрос о стеке потока, в котором говорится о том, как выделять текст с помощью JavaScript.

Можете ли вы установить и / или изменить выбор текста пользователя в JavaScript?

Мне удалось изменить его скрипт, чтобы он мог работать в вызове getEval из Selenium.IDE (если вы используете Selenium по-другому, возможно, вам придется изменить его).Я также удалил код, не относящийся к Firefox:

function selectElementContents(el,start,end) {
    var sel = window.getSelection();
    var range = window.document.createRange();
    range.setStart(el,start);
    range.setEnd(el,end);
    sel.removeAllRanges();
    sel.addRange(range);
}
selectElementContents(window.document.getElementById("container").firstChild,10,20)

Это позволяет вам выбирать диапазон текста в пределах одного элемента.«Контейнер» - это идентификатор элемента, содержащего текст, а 10 и 20 - это индексы символов, с которых нужно начинать и останавливаться.

Просто сожмите это до одной строки, добавьте в оператор Selenium getEvalи он должен выбрать текст для вас.

Если текст в пределах одного элемента недостаточно гибок для вас, документация по диапазонам JavaScript должна предоставить вам дополнительные детали, которые вам нужны.

0 голосов
/ 09 августа 2017

Связывание подхода, предложенного Джошем, с вспомогательной функцией Capybara (и добавление необязательных аргументов позиции для частичного выбора в элементах start / end):

module TextSelection
  def select_text(startEl, endEl, startPos = 0, endPos = 0)
    js = <<-JS
      var sel = window.getSelection();
      var range = window.document.createRange();
      range.setStart(arguments[0],#{startPos});
      range.setEnd(arguments[1],#{endPos});
      sel.removeAllRanges();
      sel.addRange(range);
    JS

    page.execute_script(js, startEl.native, endEl.native)
  end
end

World(TextSelection)

Затем в тесте:

start_el = first('#first')
end_el = first('#last')
select_text(start_el, end_el)
...