Selenium webdriver нажмите google search
Я ищу текст "Сыр!" на главной странице google и не знаете, как я могу нажать на найденные ссылки после нажатия кнопки поиска. Например, я хотел нажать третью ссылку сверху на странице поиска, затем как найти ссылку и нажать на нее. Мой код:
package mypackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
public class myclass {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\selenium-java-2.35.0\\chromedriver_win32_2.2\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.google.com");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys("Cheese!");
element.submit();
//driver.close();
}
}
Ответы
Ответ 1
Google сжимает свои классы css и т.д., поэтому не все легко идентифицировать.
Также у вас есть проблема, что вам нужно "подождать", пока сайт не покажет результат.
Я бы сделал это следующим образом:
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys("Cheese!\n"); // send also a "\n"
element.submit();
// wait until the google page shows the result
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("resultStats")));
List<WebElement> findElements = driver.findElements(By.xpath("//*[@id='rso']//h3/a"));
// this are all the links you like to visit
for (WebElement webElement : findElements)
{
System.out.println(webElement.getAttribute("href"));
}
}
Это выведет на печать:
Ответ 2
Было бы несколько способов найти элемент (в вашем случае третий результат поиска Google).
Один из способов использования Xpath
#For the 3rd Link
driver.findElement(By.xpath(".//*[@id='rso']/li[3]/div/h3/a")).click();
#For the 1st Link
driver.findElement(By.xpath(".//*[@id='rso']/li[2]/div/h3/a")).click();
#For the 2nd Link
driver.findElement(By.xpath(".//*[@id='rso']/li[1]/div/h3/a")).click();
Другие параметры:
By.ByClassName
By.ByCssSelector
By.ById
By.ByLinkText
By.ByName
By.ByPartialLinkText
By.ByTagName
Чтобы лучше понять каждый из них, вы должны попробовать изучить Selenium на чем-то более простом, чем на странице результатов поиска Google.
Пример - http://www.google.com/intl/gu/contact/
Взаимодействовать с полем ввода текста с помощью заполнителя "Как мы можем помочь? Спросите здесь". Вы можете сделать это таким образом -
# By.ByClassName
driver.findElement(By.ClassName("searchbox")).sendKeys("Hey!");
# By.ByCssSelector
driver.findElement(By.CssSelector(".searchbox")).sendKeys("Hey!");
# By.ById
driver.findElement(By.Id("query")).sendKeys("Hey!");
# By.ByName
driver.findElement(By.Name("query")).sendKeys("Hey!");
# By.ByXpath
driver.findElement(By.xpath(".//*[@id='query']")).sendKeys("Hey!");
Ответ 3
Основываясь на быстрой проверке google web, это будет путь CSS к ссылкам в списке страниц
ol[id="rso"] h3[class="r"] a
Итак, вы должны сделать что-то вроде
String path = "ol[id='rso'] h3[class='r'] a";
driver.findElements(By.cssSelector(path)).get(2).click();
Однако вы также можете использовать xpath
, который не рекомендуется в качестве лучшей практики, а также локаторы JQuery, но я не уверен, что вы можете использовать их aynywhere else, кроме Аркилийский графен
Ответ 4
@Test
public void google_Search()
{
WebDriver driver;
driver = new FirefoxDriver();
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebElement element = driver.findElement(By.name("q"));
element.sendKeys("Cheese!\n");
element.submit();
//Wait until the google page shows the result
WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("resultStats")));
List<WebElement> findElements = driver.findElements(By.xpath("//*[@id='rso']//h3/a"));
//Get the url of third link and navigate to it
String third_link = findElements.get(2).getAttribute("href");
driver.navigate().to(third_link);
}
Ответ 5
Простым Xpath для поиска окна поиска Google является:
Xpath =//span [текст() = "Поиск Google" ]
Ответ 6
public class GoogleSearch {
public static void main(String[] args) {
WebDriver driver=new FirefoxDriver();
driver.get("http://www.google.com");
driver.findElement(By.xpath("//input[@type='text']")).sendKeys("Cheese");
driver.findElement(By.xpath("//button[@name='btnG']")).click();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
driver.findElement(By.xpath("(//h3[@class='r']/a)[3]")).click();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}
}
Ответ 7
Поздний ответ, но большинство ответов устарели.
Здесь обновленная версия python для поиска google и получения всех результатов href's:
import urllib.parse
import re
from selenium import webdriver
driver.get("https://google.com/")
q = driver.find_element_by_name('q')
q.send_keys("always look on the bright side of life monty python")
q.submit();
sleep(1)
links= driver.find_elements_by_xpath("//h3[@class='r']//a")
for link in links:
url = urllib.parse.unquote(webElement.get_attribute("href")) # decode the url
url = re.sub("^.*?(?:url\?q=)(.*?)&sa.*", r"\1", url, 0, re.IGNORECASE) # get the clean url
Обратите внимание, что элементы id
/name
/class
(@class='r'
) изменяются в зависимости от агента пользователя.
В приведенном выше коде использовался пользовательский агент по умолчанию PhantomJS.