Element not found in the cache (Droplist)

Всем добрый вечер,

Цель:  Пройтись по каждому элементу списка, и скопировать нужную инфу в файл. Загвоздка в том, что при работе со вторым элементом возникает ошибка: Element not found in the cache, т.е получается что-то обновилось.

 

Шаги такие:

Зашли на главную страницу

Выбрали первый элемент

Перешли на первый элемент, скопировали нужную инфу

Вернулись обратно на главную страницу

Вывбрали второй элемент

и Т.Д

 

Проверил, локаторы остаются уникальными, когда происходит редирект на глав.страницу

Код:

        driver.get("site.ru");
        WebElement select = driver.findElement(By.id("select-manufacturer"));
        List<WebElement> options = select.findElements(By.cssSelector("select#select-manufacturer > option"));

for (int i = 0; i < 293; i++) {
            options.get(i).click();
            List<WebElement> nameOfproducts = driver.findElements(By.cssSelector("h2.product-name a"));
            if (nameOfproducts != null) {
                System.out.println("Копируем в файл");
                 }
               
               else {
                 driver.navigate().back();
                  System.out.println("Нет данных");
               }
            driver.navigate().back();

}

C циклом foreach, так же не работает.

Гуглил, но решения которые рассматриваются, мне не помогают.

 

Кто сталкивался с данной проблемой, прошу помочь.

Желательно без каких-либо костылей :))

Спасибо

 

если есто selector то есть клас Select в либе веб драйвера)

ИМХО, вам надо это вот дело

WebElement select = driver.findElement(By.id("select-manufacturer"));
        List<WebElement> options = select.findElements(By.cssSelector("select#select-manufacturer > option"));

поместить в цикл. Тогда всё будет ок. Попробуйте

Я пробывал использовать select, не идет.

"Select nameOfBrands = new Select(driver.findElement(By.id("select-manufacturer")));"

а есть публичная страница, чтобы посмотреть на приложение?

Да, есть.

http://www.soundstore.fi/

На главной: select#select-manufacturer

 

WebElement select = driver.findElement(By.id("select-manufacturer"));
        List<WebElement> options = select.findElements(By.cssSelector("select#select-manufacturer > option"));
        for (int i = 0; i < options.size(); i++) {
            wait(4);
             List<WebElement> options1 = select.findElements(By.cssSelector("select#select-manufacturer > option"));
            options1.get(i).click();
            List<WebElement> nameOfproducts = driver.findElements(By.cssSelector("h2.product-name a"));
            if (nameOfproducts != null) {
                System.out.println("Данный шаг");
                 }
               
               else {
                  // driver.findElement(By.cssSelector("li.home")).click();
                   driver.navigate().back();
               }
            System.out.println("Идем назад");
            driver.navigate().back();

Если я тебя правильно, понял, то тоже не работает. Я так уже пробывал )

 

# -*- coding: utf-8 -*-
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re
import random, string, sys
 
base_url = "http://www.soundstore.fi/"
 
def artem_test_attempt(driver):
driver.get(base_url)
for i in range(230):
option = driver.find_element_by_xpath(".//*[@id='select-manufacturer']/option[substring-after(@value, 'http://www.soundstore.fi/catalogsearch/advanced/result/')][" + str(i+1) +"]")
option.click()
time.sleep(5)
# make some shit
driver.back()
 
class Artem(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = base_url
        self.verificationErrors = []
 
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
 
    def test_artem(self):
        artem_test_attempt(self.driver)
 
Очень даже работает :) python
PS Не обращайте внимание на лишние импорты

Попробуй так:

		FirefoxDriver driver = new FirefoxDriver();
		driver.get("http://www.soundstore.fi/");
	List<webelement> Options = new ArrayList<webelement>();
	WebElement selectDropdown = driver.findElement(By.id("select-manufacturer"));

	Select select = new Select(selectDropdown);
	Options = select.getOptions();

	int mnfctrs_count = Options.size();

	for (int i = 1; i &lt; mnfctrs_count; i++) {
		new Select(driver.findElement(By.id("select-manufacturer"))).selectByIndex(i);

		List<webelement> nameOfproducts = driver.findElements(By.cssSelector("h2.product-name a"));
		if (nameOfproducts != null) {
			System.out.println("i="+i+"//"+mnfctrs_count+"; Копируем в файл");
		}

		else {
			driver.navigate().back();
			System.out.println("Нет данных");
		}
		driver.navigate().back();
	}

Все заработало.

Всем спасибо!

 

Вот этот локатор просто бог локаторов :))

//*[@id='select-manufacturer']/option[substring-after(@value, 'http://www.soundstore.fi/catalogsearch/advanced/result/')][" + str(i+1) +"]

Я не знал, что в локаторах можно применять "i".

В by css так же можно применять или нет?

 

Я так понимаю про локатор такого вида можно прочитать тут: http://www.w3.org/TR/xpath/ или в другом месте?

 

За локатор  - респект!

 

 

 

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

вы можете добавлять все что хотите в эту сроку

как один из вариантов, это добавление индекса

Вам нужно пройти базовий курс программирования для тестировщиков. Так потом легче будет автоматизировать)

Я дуюма в базовом курсе, такого не рассматривают.

 

Ну как бы:

//*[@id='select-manufacturer']/option[substring-after(@value, 'http://www.soundstore.fi/catalogsearch/advanced/result/')]

это локатор.

:)

где можно прочитать про:

"динамически составленная строка"?

 

 

 

про локаторы вам сюда http://automated-testing.info/trainings/video-kak-pisat-lokatory-dlya-selenium-webdriver/report

про java strings, вам сюда http://docs.oracle.com/javase/tutorial/java/data/strings.html

я например в своем курсе по python такое рассматриваю http://poliarush.com/trainings/python

но это просто базовые навыки программирования на java

ну кагби ето вопрос конкатенации стрингов, ето рассматривают в любом курсе по программированию)