у меня есть мануальное действие, ето зажать Shift и вибрать несколько линий, Я могу сделать ето selenium'ом в robot framework

у меня есть мануальное действие, ето зажать Shift и вибрать несколько линий, Я могу сделать ето selenium’ом в robot framework

Chain Click xpath=(//td[@class=‘oe-field-cell oe_date’])[last()-2]
Chain Click xpath=(//td[@class=‘oe-field-cell oe_date’])[last()-1]
Chains Perform Now

ети дейстивия не делают то что надо (оно просто кликает по очереди) а должно вибрать 2 как будто зажата клавиша Shift.

Посмотрите action chains

1 лайк

Я от туда и брал. ети дейстивия не делают то что надо (оно просто кликает по очереди) а должно вибрать 2 как будто зажата клавиша Shift.

Потому что эта библиотека не развивается. Человек сделал 2 коммита в 2012 году, ему хватило для работы,и дописывать не стал.
Возьмите и допилите по аналогии кейворды с действиями key_down и key_up, тогда будет счастье.

1 лайк

можеш навести пример с теми xpath’ами которые я написал?

Получилось ли решить задачу?

У меня подобная ситуация - есть страница на ней много текста мне нужно выделить с 3 по N-1 абзац и скопировать как-то выделенное чтоб в дальнейшем вставить, может у кого-то есть идеи как такое реализовать?

можно python функцию добавить

def some(self):
    journal_item = self.find("(//*[contains(text(), '225 Test Supplier')])[2]")
    journal_item_1 = self.find("(//*[contains(text(), '225 Test Supplier')])[3]")
    actions = ActionChains(self.driver)
    actions.key_down(Keys.CONTROL).click(journal_item).click(journal_item_1).perform()

Что-то подобное я реализовал когда-то с помощью JS, то есть мы пишем js скриптец и выполняем его в коде автотестов. Для выполнения в коде можно заюзать такой метод:

/**
 * @param javascript the Javascript to execute on the current page
 * @return Returns an Object returned by the Javascript provided
 */
public void Object executeJS(String javascript) {
    Object returnObj = null;
    try {
        JavascriptExecutor jsExecutor = (JavascriptExecutor) getDriver();
        returnObj = jsExecutor.executeScript(javascript);
    } catch(Exception e) {
        logger.error("Javascript execution failed! Please investigate into the issue.");
        logger.debug("Failed Javascript:" + javascript);
    }
    return returnObj;
}

выполнение этого метода будет таким, пример:

executeJS("тут_указываем_наш_js_стрингом");

Сам JS будет каким-то таким, пример, что юзал я, вам надо его немного подпилить под свои нужды… Указать первый элемент за который ухватиться…

<!DOCTYPE HTML>
<html>
<body>

  <div class="col-lg-12">
    <div id="login">
      <h2 id="qqq">Some text about!!!!</h2>
    </div>
  </div>
  
  <script>
    function domRangehighlight(text) {
      var root = document.getElementById('qqq').firstChild;
      var content = root.nodeValue;
      if (~content.indexOf(text)) {
        if (document.createRange) {
          var rng = document.createRange();
          rng.setStart(root, content.indexOf(text));
          rng.setEnd(root, content.indexOf(text) + text.length);
          // Start: эту часть можно удалить, она подсвечивает текст на странице
          var highlightDiv = document.createElement('span');
          highlightDiv.style.backgroundColor = 'red';
          rng.surroundContents(highlightDiv);
          // END: эту часть можно удалить, она подсвечивает текст на странице
          return rng.toString();
        }
      } else
        alert('Совпадений не найдено');
    }
    
    var foo = domRangehighlight('about');
    
    alert(foo);
    
  </script>

</body>

</html>

Данный пример вернет вам текст, который обработает javascript. Там уже можно юзать разные подходы, к примеру передавать нужные текст в метод и скрипт, который надо найти и скопировать или хвататься по xpath за разные элементы и брать только то что находится в них… В общем там уже воображению нет предела… :slight_smile:

Вот тут почитайте, как подобный js подпилить для себя и как это реализовуется - Выделение: Range, TextRange и Selection

Таким образом, вам вернется стринга, согласно ваших требований, которой можно манипулировать в тестах или делать какие-то проверки…

1 лайк