2015-06-12 2 views
0

Мне нужно запустить Selenium на машине Linux и использовать HtmlUnitDriver для этого.NoSuchElementException при использовании Xpath с HtmlUnitDriver

Selenium script содержит большую часть Xpath, чтобы найти элементы. Во время работы NoSuchElementException отображается в тех местах, где используется xpath.

org.openqa.selenium.NoSuchElementException: Unable to locate a node using //*[contains(text(),'Sample Text')] 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html 

Тот же код отлично работает с другими драйверами, такими как Chrome, Firefox или IE.

Мой код выглядит, как показано ниже,

HtmlUnitDriverdriver = new HtmlUnitDriver(); 
    driver.setJavascriptEnabled(true); 
    driver.get("http://example.com"); 
    driver.findElement(By.id("username")).sendKeys("xxx"); 
    driver.findElement(By.id("password")).sendKeys("yyy"); 
    driver.findElement(By.id("loginButton")).click(); 
    Thread.sleep(2000); 
    driver.findElement(By.xpath("//*[contains(text(),'Sample Text')]")).click(); 

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

Также поиск элемента по ID или имени невозможен в моем случае использования, поскольку он меняется каждый раз.

Я могу использовать только xpath, чтобы найти текст внутри тега span.

Мне нужно решение для этого. Заранее спасибо!

Edit:

Я попробовал то же самое для GMAIL входа, все еще я получаю один и тот же вопрос,

driver.get("http://www.gmail.com"); 
     driver.findElement(By.id("Email")).sendKeys("[email protected]"); 
     driver.findElement(By.id("next")).click(); 
     Thread.sleep(2000); 
     driver.findElement(By.id("Passwd")).sendKeys("yyy"); 
     driver.findElement(By.id("signIn")).click(); 
     Thread.sleep(8000); 
     driver.findElement(By.xpath("//*[contains(text(),'COMPOSE')]")).click(); 
+0

Есть ли какие-либо 'iframe'?? – Saifur

+0

Нет. Iframe не доступен – Jugi

+1

можете ли вы разместить URL-адрес? –

ответ

0

Рассматривают также избавившись от text(), что может привести к такого рода проблемы. Используйте вместо этого:

contains(., 'Sample Text') 

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

0

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

//This will store your locator for later use 
By elementLocator = By.xpath("//*[contains(text(),'Sample Text')]"); 

//This creates a reusable wait object 
WebDriverWait wait = new WebDriverWait(browser.driver, 15); 

//Waiting is stopped right after the condition is satisfied or timeout (set in the previous line, in secs) was reached 
wait.until(ExpectedConditions.elementToBeClickable(elementLocator)); 

Если вы получаете ту же ошибку, вы можете попробовать это

try { 
    wait.until(ExpectedConditions.elementToBeClickable(elementLocator)); 
} catch (org.openqa.selenium.TimeoutException e) { 
    System.out.println(driver.getPageSource()); 
} 

Чтобы увидеть, присутствует ли на странице вы ищете для него элемент.