1

Я пытаюсь получить Selenium для выбора опции из меню выбора, созданного официальным плагином jQueryUI, как описано более подробно ниже, Selenium открывает меню и затем идет щелчок, чтобы выбрать элемент, закрывает меню, но опция не выбрана.Как автоматизировать jQueryUI selectmenu с веб-драйвером Selenium/Selenium IDE

Некоторые фон на установке:

  • Использование Селен IDE Firefox Plugin
  • Использование страницы jQueryUI SelectMenu Demo, чтобы проверить на (Таким образом, мы можем гарантировать, что фрагмент кода один каждый может получить доступ, и устранить что selectmenu по меньшей мере, надлежащим образом реализованы, как его их демо-сайт) источник

Тест: http://jqueryui.com/selectmenu/

Я попытался настроить таргетинг на span.ui-selectmenu-text для щелчка селена, а затем щелкнуть элемент с ID = ui-id-5, не повезло. Затем я попытался нажать кнопку span.speed-button, а затем выбрать вариант. Также не повезло.

Во всех случаях меню открывается и закрывается, но исходное значение по-прежнему выбрано.

Однако происходит странное явление. В Selenium IDE, если я сделаю следующее, выберем его:

  1. Двойной щелчок по команде для открытия меню.
  2. Дважды щелкните по команде, чтобы выбрать правильный элемент идентификатора.
  3. Дважды щелкните мышью на Command для выбора нужного элемента ID.

Внезапно выбранная опция обновляется. Но когда я запускаю сценарий до конца, с двумя командами щелчка, он снова сбой и просто имеет параметр по умолчанию, выбранный на странице.

Код:

<tr> 
    <td>open</td> 
    <td>/selectmenu/</td> 
    <td></td> 
</tr> 
<tr> 
    <td>click</td> 
    <td>css=span.ui-selectmenu-text</td> 
    <td></td> 
</tr> 
<tr> 
    <td>click</td> 
    <td>id=ui-id-5</td> 
    <td></td> 
</tr> 

Если кто-то может мне точку в правильном направлении, любые советы или подсказки, или фактическое решение проблемы, это было бы здорово.

Я сделал поиск SO перед публикацией, но только один я смог найти от 3-х лет назад, и решение не работать больше:

how to test using ui selectmenu (jQuery) and selenium

ответ

0

Если все вы заинтересованы в том, чтобы выбрать одно значение, которое вы можете сделать, не нажимая и не открывая меню. Просто запустите: | выбрать | локатор фактического элемента SELECT html | значение, которое вы хотите |

Это работает, потому что jQuery.ui.selectmenu берет элемент SELECT html и соответственно стиляет его.

<tr> 
    <td>select</td> 
    <td>id=address-state</td> 
    <td>label=Alabama</td> 
</tr> 

Теперь, если вы действительно хотите, чтобы имитировать весь пользовательский ввод с пользовательским интерфейсом, то вы должны использовать команду clickAt, такие как:

<tr> 
    <td>clickAt</td> 
    <td>id=ui-id-1-button</td> 
    <td></td> 
</tr> 

гай-ID-1-кнопкой является DIV из jQuery.ui.select, как показано на вашей странице (используйте инспектора в Chrome или FF, чтобы увидеть структуру DOM). Чтобы выбрать, посмотрите в DOM в нижней части страницы, где есть DIV с UL, обычно идет сгенерированным идентификатором ui-id-1-menu, а внутри него вы имеете варианты выпадающего списка, которые вы можете просто использовать селектор и отправьте команду clickAt.

я за один придумал, как прокрутить ниспадающего и принимать снимки экрана страницы опций на странице с помощью пользовательского extensions.js команды:

Selenium.prototype.doScreenshootSelectMenuOptions = function(btnLocator, jsonOptions) { 
 
    /** 
 
    * Capture the jQuery.ui.selectmenu dropdown option values page by page screenshots. 
 
    * 
 
    * @param btnLocator Element locator for the selectmenu button 
 
    * @param jsonOptions Options for the command as a JSON string. They are <code> 
 
    *      {"dropdownLocator":"<optional value>", "fileName":"<optional value>", "extension":"<optional value>"} 
 
    *      <\code> 
 
    *      <ul> 
 
    *       <li>dropdownLocator: Optional element locator for hidden selectmenu options locator. If 
 
    *       ommited it will be computed from options.dropdownLocator</li> 
 
    *       <li>fileName: Optional name of the file to use for the screenshot. It will be appended 
 
    *       with ' pg#' where # is the drop down page number. If omitted the default file name is 
 
    *       'Dropdown'</li> 
 
    *       <li>extension: Optional name of the file extension to use for the screenshot. If 
 
    *       omitted the default extension is '.png'</li> 
 
    *      </ul> 
 
    */ 
 
    LOG.debug("user-extensions: doScreenshootSelectMenuOptions('" + btnLocator + "', '" + jsonOptions + "')"); 
 

 
    var btn = this.browserbot.findElement(btnLocator); 
 
    if(btn.id.indexOf('-button') <= 0) { 
 
     throw new SeleniumError("screenshootSelectMenuOptions: wrong value for 'btnLocator'. It's applied to jQuery.ui.selectmenu drop downs!"); 
 
    } 
 

 
    var options = JSON.parse(jsonOptions); 
 
    if(typeof options.dropdownLocator === 'undefined') { 
 
     options.dropdownLocator = btn.id.substr(0, btn.id.indexOf('-button')) + '-menu'; 
 
    } else if(options.dropdownLocator.indexOf('-menu') <= 0) { 
 
     throw new SeleniumError("screenshootSelectMenuOptions: wrong value for 'jsonOptions.dropdownLocator'. It's applied to jQuery.ui.selectmenu drop downs!"); 
 
    } 
 

 
    options.fileName = (typeof options.fileName !== 'undefined') ? options.fileName : "Dropdown"; 
 
    options.extension = (typeof options.extension !== 'undefined') ? options.extension : ".png"; 
 
    var ddBtn   = this.browserbot.findElement(btnLocator), 
 
     opts   = this.browserbot.findElement(options.dropdownLocator); 
 
    ddBtn.scrollIntoView();  // Scroll to dropdown so it has room to open downwards 
 
    this.doClickAt(btnLocator); // Open dropdown 
 

 
    var height   = isNaN(parseInt(opts.style.height)) ? opts.scrollHeight : parseInt(opts.style.height), 
 
     scrollHeight = opts.scrollHeight, 
 
     pages   = scrollHeight/height, 
 
     level   = utils.screenshoot.getNextLevel(); 
 
    if(pages <= 0) { 
 
     throw new SeleniumError("screenshootSelectMenuOptions could not computer the number of dropdown menu pages to screenshoot!"); 
 
    } 
 

 
    // For each dropdown values page(s) 
 
    for(var pgNr = 0; pgNr < pages; pgNr++) { 
 
     var pgHeight = (pgNr * height); 
 
     LOG.debug("user-extensions: screenshootSelectMenuOptions opts.scrollTo('0', '" + pgHeight + "')"); 
 
     opts.scrollTo(0, pgHeight); 
 
     this.doScreenshotEntirePage(options.fileName + ' pg' + (pgNr + 1) + options.extension, level); 
 
     ddBtn.scrollIntoView(); 
 
    } 
 

 
    this.doClickAt(btnLocator); // Close dropdown 
 
    utils.screenshoot.resetFromLevel(level); 
 
};

0

я на самом деле, наконец, нашел действительно простой ответ на эту проблему. Сначала вы используете mouseOver, затем нажмите. Задача решена.

Надеюсь, это поможет.

Пол, поскольку вы потратили время на то, чтобы ответить на этот вопрос, чтобы быть справедливым для вас, я оставлю его избирателям, чтобы выбрать «принятый ответ». Спасибо за ваш вклад.