Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Element not found in the cache (Droplist)


(Artem) #1

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

Цель:  Пройтись по каждому элементу списка, и скопировать нужную инфу в файл. Загвоздка в том, что при работе со вторым элементом возникает ошибка: 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, так же не работает.

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

 

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

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

Спасибо

 


(Taras) #2

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


(Alexander Petrovich) #3

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

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

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


(Artem) #4

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

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


(Mykhailo Poliarush) #5

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


(Artem) #6

Да, есть.

http://www.soundstore.fi/

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

 


(Artem) #7

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

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


(Alexander Petrovich) #8

 

# -*- 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 Не обращайте внимание на лишние импорты

(player1) #9

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

		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();
	}

(Artem) #10

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

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

 

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

//*[@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/ или в другом месте?

 

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

 

 

 


(Mykhailo Poliarush) #11

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

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

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


(Taras) #12

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


(Artem) #13

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

 


(Artem) #14

Ну как бы:

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

это локатор.

:)

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

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

 

 

 


(Mykhailo Poliarush) #15

про локаторы вам сюда 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


(Mykhailo Poliarush) #16

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

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


(Taras) #17

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