WebDriver не может найти элемент по xpath с помощью Java

Ниже приведен фрагмент кода WebDriver с использованием Java:

        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.google.pl/");
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
        WebElement element = driver.findElement(By.name("q")); 
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
WebElement query = driver.findElement(By.xpath("//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input"));

query.sendKeys("asd");

После выполнения кода возникло следующее исключение:

Исключение в потоке "main" org.openqa.selenium.NoSuchElementException: невозможно найти элемент: {"метод": "xpath", "селектор": "// html / body / div [2] / span / center / form / table / tbody / tr / td [2] / div / div / input "} Информация о системе: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_24' Информация о драйвере: driver.version: RemoteWebDriver в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance java.lang.reflect.Constructor.newInstance (Неизвестный источник) в org.openqa.selenium.remote.ErrorHandler.createThrowable (ErrorHandler.java:131) в org.openqa.selenium.remote.ErrorHandler.throwIfResponse ) на org.openqa.selenium.remote.RemoteWebDriver.execute (RemoteWebDriver.java:409) на org.openqa.selenium.remote.RemoteWebDriver.findElement (RemoteWebDriver. java: 192) на org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath (RemoteWebDriver.java:265) на org.openqa.selenium.By $ 6.findElement (By.java:205) на org.openqa.selen. RemoteWebDriver.findElement (RemoteWebDriver.java:184) в test.main (test.java:24)

Что не так в моем коде?


person user729076    schedule 28.04.2011    source источник
comment
Выражение XAPTH не оценивает существующий элемент, вот и все. Вы должны изменить выражение.   -  person forty-two    schedule 28.04.2011
comment
Что xpath должен показывать на этом сайте?   -  person AutomatedTester    schedule 28.04.2011
comment
Я тестирую веб-приложение и могу идентифицировать элементы только по xpath. Поэтому я пытаюсь сделать пример в Google. В обоих случаях это не работает. Этот xpath относится к тому входу, где вы вводите слова, а затем нажимаете поиск. Не могли бы вы сказать мне, какое выражение мне следует изменить выше одного?   -  person user729076    schedule 28.04.2011
comment
В зависимости от вашего HTML, вы указали недопустимый xpath, здесь нет проблем с Selenium. Он работает именно так, как должен.   -  person Ardesco    schedule 09.05.2011
comment
Ваш xpath слишком длинный (абсолютный xpath), что является плохой практикой. Вы должны попробовать короткий xpath (относительный xpath). CssSelector быстрее, чем xpath. И лучше использовать id или name, чем xpath. Есть ли в вашем HTML-коде идентификатор или имя? Если да, используйте ID или имя   -  person Ripon Al Wasim    schedule 24.01.2013


Ответы (6)


@ user729076: xpath «// html / body / div [2] / span / center / form / table / tbody / tr / td [2] / div / div / input», который вы написали для текстового поля Google, неверен. HTML для текстового поля Google выглядит следующим образом:

<input type="text" value="" autocomplete="off" name="q" class="gbqfif" id="gbqfq" style="border: medium none; padding: 0pt; margin: 0pt; height: auto; width: 100%; background: url(&quot;data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D&quot;) repeat scroll 0% 0% transparent; position: absolute; z-index: 6; left: 0px; outline: medium none;" dir="ltr" spellcheck="false">

На основе приведенного выше HTML вы можете использовать просто id или xpath, как показано ниже: По идентификатору:

driver.findElement(By.id("gbqfq")).sendKeys("some text");

По xpath:

driver.findElement(By.xpath("//input[@id='gbqfq']")).sendKeys("some text");
person Ripon Al Wasim    schedule 06.09.2012

Ваше выражение xpath:

WebElement query = driver.findElement(By.xpath("//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input"));

выглядит правильно, но если проблема не исчезла, проверьте правильность xpath еще раз. Если это снова не удается, увеличьте время ожидания как:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

или вы можете использовать явное ожидание определенного элемента, как показано ниже:

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input")));
person Ripon Al Wasim    schedule 18.06.2012
comment
Я использовал немного другой синтаксис. WebElement email = webdriver.findElement (By.xpath (// input [@ id = 'signin_username'] [2])); Это не находит [2], хотя - person ; 06.11.2012
comment
Если это не удается после использования явного ожидания, еще раз проверьте правильность xpath. Или вы можете использовать id или name вместо xpath - person Ripon Al Wasim; 28.01.2013

Поскольку вы хотите, чтобы польский сайт Google

    //input[@title='Google Search']

у вас не пойдет. Вместо этого используйте

    //input[@title='Szukaj w Google']
person Mikael Magnusson    schedule 24.05.2011

В этом случае вам нужно выражение XPath:

//html/body/center/form/table/tbody/tr/td[2]/div/input

Или вы можете использовать это (более интуитивно понятное):

//input[@title='Google Search']

Имейте в виду, что если вы будете определять множество элементов с помощью XPath, было бы желательно свободно владеть XPath, вы можете начать здесь: Руководство по Xpath

А пока используйте Firefox и установите следующие плагины:

Firebug

FirePath или Firefinder

Это поможет вам легко определить допустимые выражения XPath для использования на вашем веб-сайте.

person Anders    schedule 29.04.2011

Если вы хотите найти элементы по XPath. Затем сделайте следующее:

WebDriver driver = new FirefoxDriver();
String baseUrl = "http://www.google.com";
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
selenium.open("http://www.google.com");
selenium.isElementPresent(XPath Variable);

Также найдите дополнительную справку на этом сайте

person hoshang.varshney    schedule 02.06.2011
comment
На самом деле нет причин возвращаться к старому Selenium RC, если OP записывает свои тесты в более новом WebDriver. - person Petr Janeček; 09.06.2012

Используемый XPath здесь неверен. Непосредственно Id отсутствует, поэтому использовать XPath нет необходимости.

driver.findElement(By.id("gbqfq")).sendKeys("xyz");
person user3487861    schedule 02.04.2014
comment
Элемент, который нужно найти, может не иметь идентификатора, и его может быть нецелесообразно добавлять только для тестов Selenium. - person Mifeet; 02.04.2014
comment
В любом случае, спасибо за участие в StackOverflow :). Вопрос, на который вы отвечаете, старый и уже ответил на него - мы будем рады, если вы приложите усилия и к более насущным вопросам. - person Mifeet; 02.04.2014