Как выбрать элемент, когда любой из элементов может быть найден с помощью Selenium и Java - PullRequest
1 голос
/ 02 мая 2019

дизайн кнопки количества отличается для каждой нагрузки.я идентифицировал их, но я хочу продолжить, когда один из элементов найден.

//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); 

Ответы [ 4 ]

2 голосов
/ 02 мая 2019

Вы можете использовать findElements() вместо findElement(), что будет возвращать список веб-элементов.

Теперь, если размер 1 , ваш скрипт узнаетэтот конкретный элемент присутствует.Если идентификатор размера 0 , то кнопка не будет видна в пользовательском интерфейсе.

Примерно так для кнопки количества:

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

Для кнопки amt:

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

Вы можете написать соответствующий блок else согласно вашему требованию.

Другой подход - использовать блок try-catch.

Дайте мне знать, если это поможет.

1 голос
/ 02 мая 2019

Как круизепандей уже предоставил логику, как обрабатывать такого рода сценарии. Для всей вашей путаницы вы можете попробовать вложенный цикл if..else, где он проверит первый размер элемента (), если он придет 0, если пойдет внутрь другого зациклите и проверьте размер второго элемента ().

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 голосов
/ 02 мая 2019

Если только одна кнопка (здесь на самом деле уместно «выбрать»), вы можете изменить свой XPath для выбора любого элемента:

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

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

Тогда не имеет значения, какой из них появляется на экране: //select[@id='quantity' or @id='amt'] & mdash; он будет соответствовать любому тегу HTML.

Это не будет работать, если на странице присутствуют оба HTML-тега, но одновременно виден только один.

0 голосов
/ 02 мая 2019

Как вы упомянули , либо один элемент найден предположительно, элемент является динамическим элементом, который вам нужно вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать любую из следующих стратегий локатора.:

  • Использование xpath :

    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); 
    
  • Использование cssSelector :

    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); 
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...