Selenium By.className () -> IndexOutOfBoundsException: индекс: 0, размер: 0 - PullRequest
0 голосов
/ 25 февраля 2019

Я пишу приложение для автоматизации веб-сайта.Поэтому мне нужно ориентироваться на элементы HTML, которые не имеют идентификатора.Я слышал, что xPath и CSS Selector не такие быстрые, поэтому я хочу перейти на By.className ().К сожалению я это не работает.Вы можете найти демо (сам инструмент не автоматизирует Google: D) ниже.

Я использую GeckoDriver 0.21.0 и Selenium 3.13.0

WebDriver d = new FirefoxDriver();
JavascriptExecutor js = (JavascriptExecutor) d;  
d.get("https://www.google.com");
WebElement we = d.findElements(By.className("gLFyf gsfi")).get(0);
js.executeScript("arguments[0].value='test';", we);

Элемент HTML

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Если это имя класса является правильным и стабильным (оно выглядит для меня сгенерированным, то есть при каждом загрузке страницы будет другое имя класса, изменение, которое нарушит ваш скрипт), я бы порекомендовал использовать

WebElement we = d.findElements(By.cssSelector(".gLFyf.gsfi")).get(0);

Как указано в другом ответе, By.className (), вероятно, смущен пробелом в имени вашего класса.

0 голосов
/ 25 февраля 2019

Во-первых, позвольте мне обратиться к заявлению «xPath и CSS Selector не такие быстрые».Они медленнее наносекунд , а может и!Прочитайте здесь , если вас интересует дополнительная информация.

Следующая ваша актуальная проблема.Атрибут class в HTML представляет собой разделенный пробелами список имен классов.В вашем By.className() вы можете использовать только один из них.

Кроме того, вы используете .findElements() (форма множественного числа) и ожидаете только один WebElement.Компилятор, вероятно, скажет вам, что вы должны ожидать List<WebElement>.Тогда в вашем .executeScript() это, очевидно, не сработает, так как это снова предполагает только один элемент.Вам придется решить, что вы на самом деле хотите здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...