Как использовать кошмар, чтобы нажать клавишу со стрелкой?

Есть ли способ использовать кошмар (модуль nodeJS) для нажатия клавиши со стрелкой? Либо отправив ключ конкретному элементу, либо щелкнув элемент и отправив нажатие клавиши на страницу в целом?

Моя проблема в том, что есть раскрывающееся меню, при нажатии на которое отображаются некоторые параметры под ним. Эти параметры не кажутся кликабельными, я пробовал щелкнуть и даже использовать расширение кошмара realClick. Ни один из них не может выбрать какой-либо элемент раскрывающегося списка. Играя со страницей, я обнаружил, что с помощью клавиш со стрелками и клавиши ввода я могу выбирать параметры, не щелкая. Итак, есть ли способ отправить события нажатия клавиш на электрон? Либо через кошмар, либо напрямую обращаясь к электрону?


person Wso    schedule 23.06.2017    source источник
comment
Возможно, вы говорите конкретно об элементе ‹select›. Вы можете выбрать значение, просто установив element.value='one среди вариантов'. или element.setSelectedIndex = 1 (начиная с 0). w3schools.com/code/tryit.asp?filename=FGVLFIS50P39   -  person devilpreet    schedule 23.06.2017
comment
@devilpreet Я пытался использовать element.setSelectedIndex, но это дало тот же результат, что и щелчок, ничего не происходит, никаких видимых изменений на веб-странице. Хотя за идею спасибо!   -  person Wso    schedule 23.06.2017
comment
Виноват. Это был element.selectedIndex. См.: Выбрать. Я работал над обнаружением таких элементов и, поверьте мне, использование HTML API — лучший вариант для работы. Единственный способ, которым я вижу, что это не происходит, - это использование пользовательских обработчиков, однако я хотел бы увидеть такой пример. Спасибо   -  person devilpreet    schedule 24.06.2017
comment
Я тоже так пробовал, не повезло. Тем не менее, спасибо за обновленное предложение, оно очень ценится. Я считаю, что проблема в том, что элемент выглядит просто div с ul внутри него, а не элементом select.   -  person Wso    schedule 26.06.2017
comment
Хм. Вы можете попробовать нажатие клавиши с помощью оценки. И важно, на какой элемент вы ориентируетесь. Кроме того, иногда может потребоваться несколько событий (которые выглядят как одно событие), как в [в этом случае] (stackoverflow.com/questions/36175940/). Если вы можете поделиться веб-сайтом или воспроизвести его, я могу попробовать.   -  person devilpreet    schedule 27.06.2017
comment
Хотя я не могу указать реальный сайт, я могу сказать, что если вы зайдете в любую поисковую систему и наберете какой-нибудь текст, это воспроизведет то, что мне нужно сделать. Мне нужно что-то ввести, нажать клавишу со стрелкой вниз, а затем нажать Enter, чтобы получить первый результат автозаполнения.   -  person Wso    schedule 29.06.2017


Ответы (1)


Это называется меню автозаполнения, и стандартного способа сделать это нет. Я попробовал работать с Google и придумал метод. Я думаю, будет сложно сделать универсальное решение, так как это зависит от того, как реализовано автозаполнение. Надеюсь это поможет!

var Nightmare = require('nightmare');

var nightmare = Nightmare({
  show: true,
  webPreferences: {}
})

nightmare
  .goto('http://www.google.co.in')
  .evaluate(function(searchTerm) {
    var elem = document.querySelector('#lst-ib');
    elem.value = searchTerm;

    //Do mousedown to initiate auto complete window
    var event = document.createEvent('MouseEvent');
    event.initEvent('mousedown', true, true);
    elem.dispatchEvent(event);
  }, 'Leo')
  .then(function() {
    //Wait for results to appear
    nightmare.wait(1000)
    .evaluate(function() {
      //Click the first option of List
      var first = document.querySelector('#sbtc > div.gstl_0.sbdd_a > div:nth-child(2) > div.sbdd_b > div > ul > li:nth-child(1)');
      first.firstElementChild.click();
    }).then(function() {
      console.log('All Done');
    });
  });
person devilpreet    schedule 29.06.2017
comment
В случае с duckduckgo это первый щелчок, чтобы открыть окно автозаполнения. И второе событие также щелкает по первому варианту. По сути, проверьте прослушиватели событий в соответствующем элементе (ввод текста и опция автозаполнения), которые дадут вам четкое представление о том, какое событие должно быть запущено. - person devilpreet; 30.06.2017
comment
Я смог заставить его работать, выбрав, а не используя клавишу со стрелкой вниз. Хотя это скорее обходной путь, чем решение, оно сработало. Спасибо за ваше предложение и пример кода! - person Wso; 05.07.2017
comment
Это не отвечает на вопрос =(, @Wso вы нашли способ действительно имитировать нажатие клавиши? - person adelriosantiago; 26.08.2018