2014-01-07 2 views
0

Я ищу некоторые советы о том, как выбрать WebElement. Когда я нажимаю кнопку, которая создает новую «страницу», данное значение является динамическим, поскольку оно полностью случайное и не последовательное. Я бы ожидал, что он будет следовать примеру: стр. 1 = 0, стр. 2 = 1, стр. 3 = 2 и т. Д.Лучший подход к использованию при динамическом создании значений?

По умолчанию я начинаю со страницы, и ее значение равно c3. Хотя, когда я вызвать кнопку, чтобы создать новые страницы значения выглядят следующим образом:

<select class="j-currentPage f-feature-A" name="currentPage"> <option value="c3">New Page</option> <option value="c277">New Page 2</option> <option value="c383">New Page 3</option> <option selected="" value="c461">New Page 4</option> </select> 

Так что, когда я пытаюсь использовать следующее:

List<WebElement> option = chrome.findElements(By.tagName("option")); 

    option.get(0).click(); 
    option.get(1).click(); 
    option.get(0).click(); 

Это, очевидно, не суметь как значения c277, c346 и т.д. и т. д., и нет никакого способа узнать, какие значения будут в новом сеансе, поскольку они всегда будут разными.

Стекловолокно выбрасывает StaleElementReferenceException, потому что его нет в DOM.

Как я могу выбрать каждую страницу, когда значения абсолютно случайны?

Я использую Webdriver и JUnit4.

EDIT

Метод испытания: создать несколько новых страниц.

@Test 
public void createANewPage(){ 
    WebDriverWait wait = new WebDriverWait(chrome, 60); 

    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select.j-currentPage.f-feature-A[name=\"currentPage\"]"))); 

    WebElement newPage = chrome.findElement(By.cssSelector("span.j-addViewBtn.ss-layers")); 
    newPage.click(); 

    List<WebElement> option = chrome.findElements(By.tagName("option")); 

    option.get(1).click(); 

    option.get(0).click(); 
} 

Затем несколько тестов позже я хочу, чтобы перезвонить созданную страницу (ы)

@Test 
public void goToPage(){ 

    new WebDriverWait(chrome, 60).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select.j-currentPage.f-feature-A[name=\"currentPage\"]"))); 
    List<WebElement> option = chrome.findElements(By.tagName("option")); 

    option.get(0).click(); 
    option.get(1).click(); 
    option.get(0).click(); 
} 

Я получаю org.openqa.selenium.StaleElementReferenceException в точке третьего option.get(0).click();

Однако я чувствую, как будто Я приближаюсь к этому неправильно, так как значения динамически создаются. <option value="c3">New Page</option>
<option value="c207">New Page 2</option>
<option value="c288">New Page 3</option>
<option selected="" value="c366">New Page 4</option>

+0

Один вопрос здесь. Вы хотите выбрать любую из этих опций. Или конкретный? –

+0

Я хотел бы иметь возможность выбирать, какую страницу я хочу. Так что конкретная страница, как я бы хотел переключиться между страницами в более поздних тестах. –

+0

Я не понял некоторых моментов. Как только вы выберете опцию, она перейдет на другую страницу, на которую вы спрашиваете: «Как я могу выбрать каждую страницу», поэтому то, что вы хотите здесь, не ясно. Не могли бы вы уточнить свой вопрос с более подробной информацией. –

ответ

0

Исключить исключение StaleElementReference означает, что это не в DOM. Это означает, что DOM изменился с момента обнаружения этого объекта и поэтому может быть удален или изменен. Изменение coudld должно быть связано с перезагрузкой страницы или обновлением HTML через javascript. В любом случае, Webdriver выдает ошибку, потому что считает, что, вероятно, хорошая идея переделать объекты по мере изменения страницы.

Если вы переделаете элементы, то это сработает. Вы находите по имени тега, поэтому тот факт, что ids изменились, не должен иметь никакого влияния.

Следующие будут работать, но имеют проблемы с производительностью;

chrome.findElements(By.tagName("option")).get(0).click 
chrome.findElements(By.tagName("option")).get(1).click 
chrome.findElements(By.tagName("option")).get(2).click 

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

+0

Возможно, у вас есть какие-то примеры для объяснения startWith, endsWith, содержит методы «У меня такое чувство, что это может быть правильный подход. Возможно, что-то вроде« содержит »(« New Page 2 »);? –

+0

Если честно, я не совсем понимаю вашу проблему. Ваш список веб-элементов найден через TagName, так что различия в идентификаторе не повлияют. Можете ли вы подтвердить, когда вы получите StaleElementException и контекст в тесте, возможно, даже покажите весь тестовый метод. –

+0

Я спрашивал, какой подход лучше всего применять, когда приложение Im automating создает динамические значения. Я думаю, что я искал это неправильно. Как вы говорите, значения ID/не должны иметь значения, поэтому вместо этого я должен смотреть на использование xpath, например: «WebElement page1 = chrome.findElementByXPath (« // option [con tains (., 'New Page')] "); page1.click(); 'и это сработало. –

0

Ни одна из стратегий FindElement() не использует регулярные выражения для поиска элементов.

Хотя есть еще один способ, используя регулярное выражение, может помочь вам

List<WebElement> option = chrome.findElements(By.tagName("option")); 

теперь петлю на опции и GetText. Затем запрограммировать регулярное выражение программно Ниже приведен демонстрационный код. Пожалуйста, переведите его в jave

foreach(WebElement link in links) 
{ 
    string text = link.Text; 
    if (Regex.Match("your Regex here", text)) 
    { 
     matchingLinks.Add(text); 
    } 
} 

foreach(string linkText in matchingLinks) // now you have the texts even if they are dynamics 
{ 
    WebElement element = driver.findElement(By.LinkText(linkText)); 
    element.Click(); 
    // do stuff on the page navigated to 
    driver.Navigate().Back(); 
} 
+0

Селекторы Css имеют простую поддержку reg для начала, заканчивается и содержит. XPath также имеет эти и, возможно, больше –

+0

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

+0

yes css selector или xpath имеет собственную поддержку регулярных выражений. Я говорю о «FindElement». Элемент find не дает какой-либо конкретной суппозиции для поиска соответствия текста регулярным выражением. Вот что я имею в виду. –

0

ОК, мне только удалось решить проблему с помощью участников этого вопроса.

Кажется, мне просто нужно было использовать xpath вместо List<WebElement>, поэтому нижеприведенный код теперь выбирает страницы, которые я хочу.

@Test 
public void jGoToPage(){ 

    new WebDriverWait(chrome, 60).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("select.j-currentPage.f-feature-A[name=\"currentPage\"]"))); 

    WebElement page1 = chrome.findElementByXPath("//option[contains(.,'New Page')]"); 
    page1.click(); 

    WebElement page2 = chrome.findElementByXPath("//option[contains(.,'New Page 2')]"); 
    page2.click(); 

    WebElement selectPage1Again = chrome.findElementByXPath("//option[contains(.,'New Page')]"); 

    selectPage1Again.click(); 

Возможно, не самый лучший код, но если кто-то хотел бы предложить лучший способ для уточнения его, пожалуйста, комментарий, чтобы другие могли узнать.

Причина, по которой я объявила New Page, была дважды потому, что я снова получал staleElementReferenceException. Таким образом, просто пытается выполнить page1.click(); сразу после page2.click();, когда это случилось, поэтому я сказал, что она selectPage1Again

Я также использовал эту question, чтобы помочь с решением.

Смежные вопросы