Выпадающий список не выбирается с помощью Selenium Webdriver в браузере Safari

В браузере Safari мне нужно выбрать параметр из раскрывающегося списка, но самое смешное, что он работает для всех браузеров, кроме Safari в Mac OS. Я использую Safari 10.0.3 с веб-драйвером selenium версии 3.3.0.

Я написал код на C#. Обратитесь к коду ниже -

    IWebDriver driver;
    driver = new SafariDriver();
    List<string> handles = driver.WindowHandles.ToList<string>();
    driver.SwitchTo().Window(handles.First());
    driver.Navigate().GoToUrl("https://myip/MyPage.aspx");
    SelectElement element = new SelectElement(driver.FindElement(By.Id("securityQuestion")));
    int totalOptions = element.Options.Count;
    Random rnd = new Random();
    int rndValue = rnd.Next(1, totalOptions);
    element.SelectByIndex(rndValue); // This is not working for Safari browser      
    driver.FindElement(By.Id("securityAnswer")).SendKeys("test");
    driver.FindElement(By.Id("ctl00_Content_btnNext")).Click();
    driver.Close();

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


person FullStackdev    schedule 11.04.2017    source источник
comment
Это проблема времени? Возможно, Safari на Mac работает медленно. Поставьте точку останова на строке SelectElement, затем выполните ее. Это работает? Если это так, вам нужно добавить несколько ожиданий.   -  person JeffC    schedule 11.04.2017
comment
если это не работает после всего, что вы делаете, как насчет использования sendKeys для выбора по видимому тексту.   -  person Gaurang Shah    schedule 13.04.2017
comment
@GaurangShah пробовал, но следующие строки кода не выполняются   -  person FullStackdev    schedule 14.04.2017
comment
@РохитН. что вы имеете в виду под не выполненным? проскочило?? это вызвало какое-либо исключение?   -  person Gaurang Shah    schedule 14.04.2017
comment
@Gaurang не исключение, просто пропускает выполнение кода, но это происходит только в браузере Safari, в остальном работает нормально, даже браузер Chrome в Mac OS запускает это без проблем.   -  person FullStackdev    schedule 15.04.2017
comment
Знаете ли вы, как увеличить размер браузера Safari с помощью веб-драйвера selenium?   -  person FullStackdev    schedule 15.04.2017


Ответы (2)


Это ошибка сафаридрайвера. Исправление находится в WebKit и отслеживается здесь: https://bugs.webkit.org/show_bug.cgi?id=174710

В качестве обходного пути вы можете изменить выбранные параметры выбора с помощью JavaScript и DOM API.

person Brian Burg    schedule 10.08.2017

Попробуйте этот пример здесь для обходного пути JS, реализованного как расширение C#. Этот код работает в Safari (проверено на версии 10.1+).

Это не полный код, просто фрагмент для упрощения. Вы можете расширить его для поддержки любых функций, которые вам нравятся.

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Internal;
using OpenQA.Selenium.Support.UI;

namespace Gravity.Plugins.Actions.Extensions
{
    public static class SelectExtensions
    {
        /// <summary>
        /// Select the option by the index, as determined by the "index" attribute of the
        /// element.
        /// </summary>
        /// <param name="selectElement">This <see cref="SelectElement"/>.</param>
        /// <param name="index">The value of the index attribute of the option to be selected.</param>
        public static void JsSelectByIndex(this SelectElement selectElement, int index)
        {
            // constants
            var script = $"options[{index}].selected = true;";

            // web element to act on
            var onElement = selectElement.WrappedElement;
            var onDriver = (IWrapsDriver)onElement;

            // execute
            ((IJavaScriptExecutor)onDriver).ExecuteScript(script, onElement);
        }

        /// <summary>
        /// Select all options by the text displayed.
        /// </summary>
        /// <param name="selectElement">This <see cref="SelectElement"/>.</param>
        /// <param name="text">The text of the option to be selected.</param>
        public static void JsSelectByText(this SelectElement selectElement, string text)
        {
            // constants
            var script =
                "var options = arguments[0].getElementsByTagName('option');" +
                "" +
                "for(i = 0; i < options.length; i++) {" +
                $"   if(options[i].innerText !== '{text}') {{" +
                "       continue;" +
                "    }" +
                "    options[i].selected = true;" +
                "    break;" +
                "}";

            // web element to act on
            var onElement = selectElement.WrappedElement;
            var onDriver = (IWrapsDriver)onElement;

            // execute
            ((IJavaScriptExecutor)onDriver).ExecuteScript(script, onElement);
        }

        /// <summary>
        /// Select an option by the value.
        /// </summary>
        /// <param name="selectElement"></param>
        /// <param name="value">The value of the option to be selected.</param>
        public static void JsSelectByValue(this SelectElement selectElement, string value)
        {
            // constants
            var script =
                "var options = arguments[0].getElementsByTagName('option');" +
                "" +
                "for(i = 0; i < options.length; i++) {" +
                $"   if(options[i].getAttribute('value') !== '{value}') {{" +
                "       continue;" +
                "    }" +
                "    options[i].selected = true;" +
                "    break;" +
                "}";

            // web element to act on
            var onElement = selectElement.WrappedElement;
            var onDriver = (IWrapsDriver)onElement;

            // execute
            ((IJavaScriptExecutor)onDriver).ExecuteScript(script, onElement);
        }
    }

    // Usage sample
    public class MySeleniumClass
    {
        public void DoAutomation()
        {
            var driver = new ChromeDriver()
            {
                Url = "https://gravitymvctestapplication.azurewebsites.net/UiControls"
            };
            var element = driver.FindElement(By.Id("select_menu"));
            var selectElement = new SelectElement(element);
            selectElement.JsSelectByIndex(1);
            selectElement.JsSelectByText("Two");
            selectElement.JsSelectByValue("3");
        }
    }
}
person Gravity API    schedule 06.06.2020