2
votes

Comment sélectionner un élément lorsque l'un des éléments peut être trouvé à l'aide de Selenium et Java

La conception du bouton de quantité est différente pour chaque charge. je les ai identifiés mais je veux continuer lorsqu'un élément est trouvé.

//select quantity 2
//sometimes button A appear
driver.findElement(By.xpath("//select[@id='quantity']")).click();
Select quantity = new Select(driver.findElement(By.xpath("//select[@id='quantity']")));
quantity.selectByIndex(1); 

//sometimes button B appear
driver.findElement(By.xpath("//select[@id='amt']")).click();
Select amt = new Select(driver.findElement(By.xpath("//select[@id='amt']")));
quantity.selectByIndex(1); 


1 commentaires

Les deux boutons apparaissent-ils en même temps, ou un bouton est-il affiché et l'autre n'est-il pas présent sur la page?


4 Réponses :


3
votes

Vous pouvez utiliser findElements () au lieu de findElement () , qui renverrait une liste d'éléments Web.

Maintenant, si la taille est 1 , votre script apprendra que cet élément particulier est présent. Si l'ID de taille 0 , le bouton ne sera pas visible dans l'interface utilisateur.

Quelque chose comme ça pour le bouton quantité:

List<WebElement> amtButton = driver.findElements(By.xpath("//select[@id='amt']"));
    if(amtButton.size()==1){
       amtButton.get(0).click();
    }  

Pour le bouton amt:

List<WebElement> quantityButton = driver.findElements(By.xpath("//select[@id='quantity']"));
if(quantityButton.size()==1){
   quantityButton.get(0).click();
}  

Vous pouvez écrivez le bloc else respectif selon vos besoins.

Une approche différente serait d'utiliser le bloc try-catch.

Faites-moi savoir si cela vous aide.


4 commentaires

je ne suis pas sûr de la logique. comment avoir la boucle pour cliquer sur l'un ou l'autre?


@ user2201789: Les deux localisateurs sont différents, je ne pense pas que vous puissiez avoir une boucle ici et dans n'importe quelle situation comme celle-là .. la seule chose que vous pouvez faire à l'OMI ici est d'utiliser le bloc try and catch. Rendez cette question ouverte, voyons si nous obtenons plus de réponses à ce sujet.


@cruisepandey: Vous pouvez utiliser une boucle imbriquée.


@KunduK: Ça pourrait être une photo. Si vous pouvez écrire cela comme une réponse, ce serait vraiment utile pour le PO.



2
votes

Comme cruisepandey a déjà fourni une logique pour gérer ce genre de scénario.Pour toute confusion, vous pouvez essayer la boucle imbriquée if..else où il vérifiera la taille du premier élément () si elle vient 0 if ira dans une autre boucle et vérifiera la taille du deuxième élément ().

if(driver.findElements(By.xpath("//select[@id='quantity']")).size()==0)
{
 if(driver.findElements(By.xpath("//select[@id='amt']")).size()>0)
 {
   driver.findElements(By.xpath("//select[@id='amt']")).get(0).click(); 
   Select amt = new Select(driver.findElement(By.xpath("//select[@id='amt']")));
   amt.selectByIndex(1); 
 }
 else
 {
   System.out.println("None of the elements present")
 }

}
else
{
  driver.findElements(By.xpath("//select[@id='quantity']")).get(0).click();
  Select quantity = new Select(driver.findElement(By.xpath("//select[@id='quantity']")));
  quantity.selectByIndex(1); 

}       


0 commentaires

1
votes

Comme vous l'avez mentionné l'un ou l'autre des éléments est trouvé , l'élément est vraisemblablement un élément dynamique dont vous avez besoin pour induire WebDriverWait pour le elementToBeClickable () et vous pouvez utiliser l'une des stratégies de localisation suivantes:

  • Utilisation de xpath :

    WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.or(
        ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select#quantity")),
        ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select#amt"))
    ));
    Select quantity = new Select(element);
    quantity.selectByIndex(1); 
    
  • Utilisation de cssSelector :

    WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.or(
        ExpectedConditions.visibilityOfElementLocated(By.xpath("//select[@id='quantity']")),
        ExpectedConditions.visibilityOfElementLocated(By.xpath("//select[@id='amt']"))
    ));
    Select amt = new Select(element);
    quantity.selectByIndex(1); 
    


0 commentaires

1
votes

Si un seul bouton (en fait "sélectionner" est approprié ici), vous pouvez modifier votre XPath pour choisir l'un ou l'autre des éléments:

WebElement quantityElement = driver.findElement(By.xpath("//select[@id='quantity' or @id='amt']"));
Select quantity = new Select(quantityElement);

quantityElement.click();
quantity.selectByIndex(1);

Ensuite, peu importe lequel apparaît à l'écran: // select [@ id = 'quantity' ou @ id = 'amt'] - il correspondra à l'un ou l'autre des identifiants de balise HTML.

Cela ne fonctionnera pas si les deux balises HTML sont présent dans la page, mais un seul est visible à la fois.


0 commentaires