Вы получаете ошибку, потому что пытаетесь щелкнуть первую ссылку (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();
Надеюсь, что это поможет.
Я уверен, что xpath - единственная проблема здесь. У нашего билета есть решение этой проблемы driver.findElement (By.xpath ("// ol [@ id = 'rso']/div [1]/div [1]/div/h3/a ")). Click() это правильно. Xpath –
Нельзя ли использовать'/'или' // '. Оба возвращают те же результаты. Однако для стандартов кодирования ваш формат xpath является правильным. Но если вы посмотрите на это по-другому, используя '//', должно быть более полезно, если вообще есть элементы, которые находятся между этими элементами html. –