Случай селектора CSS для атрибутов

Если у меня есть элемент HTML селектор css должен быть чувствителен к регистру:

input[value='Search'] соответствует

input[value='search'] не соответствует

Мне нужно решение, в котором работает подход, не учитывающий регистр. Я использую Selenium 2 и JQuery , поэтому ответы для обоих приветствуются.

Он теперь существует в CSS4, см. Этот ответ .

В противном случае для jQuery вы можете использовать …

 $(':input[name]').filter(function() { return this.value.toLowerCase() == 'search'; }); 

jsFiddle .

Вы также можете сделать пользовательский селектор …

 $.expr[':'].valueCaseInsensitive = function(node, stackIndex, properties){ return node.value.toLowerCase() == properties[3]; }; var searchInputs = $(':input:valueCaseInsensitive("Search")'); 

jsFiddle .

Пользовательский селектор немного перехитрит, если делать это один раз, но если вам нужно использовать его много раз в своем приложении, это может быть хорошей идеей.

Обновить

Возможно ли иметь такой пользовательский селектор для любого атрибута?

Конечно, посмотрите следующий пример. Это немного запутанный (синтаксис, такой как :input[value:toLowerCase="search"] возможно, был более интуитивным), но он работает 🙂

 $.expr[':'].attrCaseInsensitive = function(node, stackIndex, properties){ var args = properties[3].split(',').map(function(arg) { return arg.replace(/^\s*["']|["']\s*$/g, ''); }); return $(node).attr(args[0]).toLowerCase() == args[1]; }; var searchInputs = $('input:attrCaseInsensitive(value, "search")'); 

jsFiddle .

Вероятно, вы можете использовать eval() чтобы сделать эту строку массивом, но я считаю, что сделать это таким образом более комфортным (и вы не будете случайно выполнять какой-либо код, который вы размещаете в своем селекторе).

Вместо этого я разделяю строку на , разделитель, а затем удаляет пробелы и " каждую сторону каждого элемента массива». Обратите внимание, что внутри цитаты не будет обрабатываться буквально. Нет причин, по которым нужно требовать буквально, но вы всегда можете указать на эту возможность. Я оставлю это до вас. 🙂

Я не думаю, что map() имеет лучшую поддержку браузера, поэтому вы можете эксплицитно перебирать массив args или увеличивать объект Array .

CSS4 (CSS Selector Level 4) добавляет поддержку для него:

 input[value='search' i] 

Это конец «i», который делает трюк.

Более широкое внедрение началось в середине 2016 года: Chrome (с версии v49), Firefox (с версии v47?), Opera и некоторые другие. IE not и Edge еще нет. См. «Могу ли я использовать» …

 input[value='Search'] matches input[value='search' i] Also matches in latest browsers 

Поддержка: версия: Chrome> = 49.0, Firefox (Gecko)> = 47.0, Safari> = 9

Вы не можете сделать это только с помощью селекторов, попробуйте:

 $('input').filter(function() { return $(this).attr('value').toLowerCase() == 'search'; }); 
  • Загрузка файлов с использованием Selenium WebDriver и Java Robot Class
  • Прокрутка страницы вверх или вниз в Selenium WebDriver (Selenium 2) с использованием java
  • Selenium WebDriver - проверка наличия элемента
  • Selenium WebDriver : как нажимать на элементы в SVG с помощью XPath
  • Selenium 2.0b3 IE WebDriver, нажмите, не стреляйте
  • org.openqa.selenium.WebDriverException: неизвестная ошибка: файл DevToolsActivePort не существует при попытке запустить браузер Chrome
  • Эквивалент waitForVisible / waitForElementPresent в тестах Selenium WebDriver с использованием Java?
  • Selenium c # Webdriver: Подождите, пока не появится элемент
  • Selenium - базовая аутентификация через URL-адрес
  • Не удалось подключиться к двоичному файлу FirefoxBinary с Selenium в Maven
  • NoSuchElementExeption, selenium, неспособный найти элемент
  • Давайте будем гением компьютера.