-1

Я пытаюсь автоматизировать работу браузера через селен, цель - google.com будет открыта, gmail текст будет искать, и первая ссылка будет нажата и открыта. Используемый код -Ссылка не открывается во время автоматизации веб-страницы с селеном

public static void main(String[] args) { 
     WebDriver driver= new FirefoxDriver(); 
     driver.get("https://www.google.co.in"); 
     driver.manage().window().maximize(); 
     WebElement searchbox= driver.findElement(By.id("lst-ib")); 
     searchbox.sendKeys("gmail"); 
     driver.findElement(By.name("btnG")).click(); 
     driver.findElement(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a")).click(); 
} 

, но ничего не происходит, я получаю сообщение об ошибке -

ошибок Exception в потоке «главный» org.openqa.selenium.NoSuchElementException: Не удалось найти Элемент: {"method": "xpath", "selector": "// ol [@ id = 'rso'] // div [1] // div [1] // div // h3 // a" }

, где я делаю неправильно?

ответ

1

После Xpath в коде в неправильном формате:

driver.findElement(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a")).click(); 

Пожалуйста, используйте следующую Xpath это будет работать отлично.

WebDriver driver= new FirefoxDriver(); 
      driver.get("https://www.google.co.in"); 
      driver.manage().window().maximize(); 
      WebElement searchbox= driver.findElement(By.id("lst-ib")); 
      searchbox.sendKeys("gmail"); 
      driver.findElement(By.name("btnG")).click(); 
      driver.findElement(By.xpath("//ol[@id='rso']/div[1]/div[1]/div/h3/a")).click(); 

Xpath какой я модифицировано есть.

driver.findElement(By.xpath("//ol[@id='rso']/div[1]/div[1]/div/h3/a")).click(); 
+0

Я уверен, что xpath - единственная проблема здесь. У нашего билета есть решение этой проблемы driver.findElement (By.xpath ("// ol [@ id = 'rso']/div [1]/div [1]/div/h3/a ")). Click() это правильно. Xpath –

+0

Нельзя ли использовать'/'или' // '. Оба возвращают те же результаты. Однако для стандартов кодирования ваш формат xpath является правильным. Но если вы посмотрите на это по-другому, используя '//', должно быть более полезно, если вообще есть элементы, которые находятся между этими элементами html. –

0

Вы получаете ошибку, потому что пытаетесь щелкнуть первую ссылку (gmail) еще до ее загрузки. Обновите свой код, чтобы реализовать wait, пока элемент не загрузится после поиска чего-либо и нажмите кнопку поиска. Существует много типов wait, доступных в Selenium, используйте явно ожидающие ожидания между двумя действиями и это мой самый предпочтительный метод. Вот как -

driver.findElement(By.name("btnG")).click(); 
(new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a"))).click(); //explicitly wait for the element to load and then click 

Другой лучший способ справиться с этим ждать элемента появляться и сохранить опрашивает страницу, если элемент обнаружился с помощью Fluent ожидания. Вот как -

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
      .withTimeout(30, TimeUnit.SECONDS) 
      .pollingEvery(5, TimeUnit.SECONDS) 
      .ignoring(NoSuchElementException.class); //create a fluent wait object 
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a"))).click(); //fluent wait until element loads 

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

WebDriver driver = new FirefoxDriver(); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //implicitly wait until element loads for predefined time 
driver.get("https://www.google.co.in"); 

Однако, самый простой, который решает проблему заключается в использовании простой sleep() метод, который я не предпочитаю использует метод sleep(). Я не предпочитаю, потому что он может бросать ошибки в моменты, когда элементам требуется больше времени для загрузки, потому что селен ждет заданное время, которое вы укажете, что является плохим стандартом кодирования. Вот как -

driver.findElement(By.name("btnG")).click(); 
Thread.sleep(5000); //Use sleep() method to wait for a predefined time 
driver.findElement(By.xpath("//ol[@id='rso']//div[1]//div[1]//div//h3//a")).click(); 

Надеюсь, что это поможет.

0

я вижу свой динамический идентификатор которые были использованы, не рекомендуется использовать динамические идентификаторы [как это будет продолжать изменять], а также использовать необходимые условия ожидания, чтобы избежать таких исключений

driver.findElement(By.id("lst-ib")); //lst-ib is dynamic value. 

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

package testclasses; 

import org.openqa.selenium.*; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.interactions.Action; 
import org.openqa.selenium.interactions.Actions; 
import org.openqa.selenium.support.ui.*; 
import org.testng.annotations.*; 

public class classa extends classparent { 

    @Test 
public void methoda() throws InterruptedException { 
     driver.manage().window().maximize(); 
     driver.get("https://www.google.co.in/"); 


     WebDriverWait wait = new WebDriverWait(driver, 10); 
     wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(text(),'Gmail')]"))); 

     WebElement close = driver.findElement(By.xpath("//a[contains(text(),'Gmail')]")); 


     if(close.isDisplayed()){ 
     System.out.println("element is visible " +close); 
     close.click(); 
     } 

     else{ 
      System.out.println("element is not visible " +close); 
     } 
     } 
} 

консольный вывод,

TestNG] Running: 
    C:\Users\Mohan Raj S\AppData\Local\Temp\testng-eclipse-1635948262\testng-customsuite.xml 

element is visible [[FirefoxDriver: firefox on WINDOWS (6d5bc9d3-cdff-4831-991a-69d7d7ce3d36)] -> xpath: //a[contains(text(),'Gmail')]] 
PASSED: methoda 

=============================================== 
    Default test 
    Tests run: 1, Failures: 0, Skips: 0 
=============================================== 


=============================================== 
Default suite 
Total tests run: 1, Failures: 0, Skips: 0 
=============================================== 
+0

'' lst-ib "' не было проблемой, с которой столкнулся ОП, и он не спросил об этом выше. –