2015-07-24 5 views
4

Я использую XPath/CSS и Selenium для поиска элементов на веб-сайте. Я хочу создать метод, в котором я повторяю список локаторов (XPath/CSS), и программа выбирает то, что работает. Другими словами, он начинается с локатора - если локатор присутствует, он возвращает true и существует цикл. В противном случае он переходит к следующему локатору в списке. Как только он исчерпывает все локаторы CSS, он переходит к XPath и так далее.Selenium: Iterate Through Element List

В настоящее время, я имею в виду реализации этого следующим образом:

public boolean iterate(WebDriver driver, By selectorType, String[] locator) 
    { 

     driver.get("URL"); 
     for(int selectorListCounter = 0; selectorListCounter < locator.length; selectorListCounter++) { 

      try 
      { 

       driver.findElement(By.(selectorType)).sendText(); 
       System.out.println("CSS Selector: " + CSS + " found"); 
       return true; 
      } catch (Exception e) 

      { 
       System.out.println(CSS + " CSS Selector Not Present"); 
       return false; 
      } 


     } 

Затем я планирую вызвать этот метод для каждого типа локатора (один раз для XPath, один раз для CSS и т.д.)

ли это лучший способ?

+0

Не могли бы вы рассказать мне, зачем вам это нужно? –

+0

Помог ли один из ответов? Или вы решили пойти с другим решением? –

ответ

0

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

//Define as many locators as you like 
private static final By cssLaunchIcon() {return By.css("div.myDemoItemActions i.launchIcon");} 
private static final By cssLaunchIcon1() {return By.css("div.myDemoItemActions i.launchIcon.a");} 
private static final By cssLaunchIcon2() {return By.css("div.myDemoItemActions i.launchIcon.li");} 
private static final By xpathLauncIcon() {return By.xpath("//ul/li/a[text()='launch']");} 
private static final By idLaunchIcon() {return By.id("launchIcon");} 

//Initialise the non empty list of locators 
List<By> locators= Arrays.asList(cssLaunchIcon(), xpathLauncIcon(), idLaunchIcon(), cssLaunchIcon1(), cssLaunchIcon2()); 

public booolean findElement(List<By> locators) { 
    Iterator<By> locs = locators().iterator(); 
    boolean found = false; 
    //while iterator has another locator && no locator found yet 
    while(locs.hasNext && !found) { 
    WebElement el = locs.next(); 
    try{ 
     if(driver.findElement(el).isDisplayed) { 
     found = true 
     } 
    } catch(NoSuchElementException e) { 
     System.out.println("Could not find " + el) 
    } 
    return found; 
} 
+0

Я вижу две проблемы с этим кодом .. 1. Код сработает, как только элемент не будет найден (исключение NoSuchElementException). Я использую try/catch, чтобы обойти это. 2. Как насчет передачи нескольких селекторов CSS (или нескольких XPath)? Код будет работать только для 1 CSS/1 XPath .. –

+0

1. Я упустил из виду. 2. Вы можете добавить столько локаторов, сколько хотите, до тех пор, пока они имеют разные имена. плохо сделать быстрое редактирование. – Cathal

+0

дополнительно отредактировал локаторы, чтобы устранить любую двусмысленность. – Cathal

1

Я на самом деле сделал это вчера как раз, чтобы ускорить мой процесс результата. Если вместо успеха и отказа у вас есть вариант 1 и вариант 2.

Неявное время ожидания составляет 1 секунду за проверку элемента в этой программе. Таким образом, цикл while длится 8 секунд (так как он делает два массива за каждую итерацию). Это проверяет наличие элемента, помещая его в массив, а затем проверяет размер массива, его элемент отсутствует, массив будет пустым. Однако, когда одно из этих условий выходит из строя, это означает, что один из ваших элементов выходит на страницу.

Затем под ним мы устанавливаем булевы, чтобы выяснить, какой из этих элементов присутствовал на странице, и поймать ошибку того, что не существует.

driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 
int checkForElement=1; 
success = false; failure = false; 
     while (driver.findElements(By.className("successMessage")).size()==0 && driver.findElements(By.className("errormessage")).size()==0 && checkForElement<=4) 
     { 
      checkForElement+=1; 
     } 
     checkForElement=1;//reset variable 
     try 
     { 
      @SuppressWarnings("unused")//suppresses the warning so that the class is clean 
      WebElement successful = driver.findElement(By.className("successMessage"));//not used practically, but logically used to look for the presence of an element without waiting the normal implicit wait time I would have at 6 seconds 
      success = true; 
     } 
     catch(Exception e) 
     { 
      success = false; 
     } 
     try 
     { 
      @SuppressWarnings("unused")//suppresses the warning so that the class is clean 
      WebElement failing = driver.findElement(By.className("errormessage"));//not used practically, but logically used to look for the presence of an element without waiting the normal implicit wait time I would have at 6 seconds 
      failure = true; 
     } 
     catch(Exception e) 
     { 
      failure = false; 
     } 

     if(success) 
     { 
      //run success code 
     } 
     else if(failure) 
     { 
      //run failure code 
     }