Je cherche le texte "Cheese!" sur la page d'accueil de google et je ne sais pas comment puis-je cliquer sur les liens recherchés après avoir appuyé sur le bouton de recherche. Par exemple, je voulais cliquer sur le troisième lien en partant du haut de la page de recherche. Comment puis-je trouver le lien et cliquer dessus. Mon code jusqu'ici:
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();
}
}
Google réduit leurs classes css, etc., il n'est donc pas facile de tout identifier.
Aussi vous avez le problème que vous devez "attendre" jusqu'à ce que le site montre le résultat . Je le ferais comme ceci:
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"));
}
}
Cela vous imprimera:
Il y aurait plusieurs façons de trouver un élément (dans votre cas, le troisième résultat de recherche Google).
L’un des moyens serait d’utiliser 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();
Les autres options sont
By.ByClassName
By.ByCssSelector
By.ById
By.ByLinkText
By.ByName
By.ByPartialLinkText
By.ByTagName
Pour mieux comprendre chacun d’entre eux, vous devriez apprendre le sélénium sur quelque chose de plus simple que la page de résultats de recherche Google.
Exemple - http://www.google.com/intl/gu/contact/
Pour interagir avec le champ de saisie de texte avec l’espace réservé "Comment pouvons-nous vous aider? Demandez ici." Vous pourriez le faire de cette façon -
# 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!");
D'après une inspection rapide de Google Web, il s'agirait d'un chemin CSS vers les liens dans la liste de pages.
ol[id="rso"] h3[class="r"] a
Donc, vous devriez faire quelque chose comme
String path = "ol[id='rso'] h3[class='r'] a";
driver.findElements(By.cssSelector(path)).get(2).click();
Cependant, vous pouvez également utiliser xpath
, ce qui n'est pas vraiment recommandé, ainsi que les localisateurs JQuery, mais je ne suis pas sûr de pouvoir les utiliser ailleurs sauf dans Arquillian Graphene
@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);
}
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);
}
}
La plupart des réponses sur cette page sont obsolètes.
Voici une version mise à jour de python pour rechercher google et obtenir tous les résultats href:
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
Veuillez noter que l'élément id
/name
/class
(@class='r'
) ** changera en fonction de l'agent utilisateur **.
Le code ci-dessus utilisé PhantomJS agent d'utilisateur par défaut.
Xpath simple pour localiser le champ de recherche Google est: Xpath = // span [text () = 'Recherche Google']