Помогите разобраться с циклом чтобы написать веб-драйвер тест


(Олег Стасів) #1

Задача состоит в том, что мне нужно найти и нажать по имени запомненного обьекта.

Мне нужно прогнать мою переменную по каждому элементу списка, если совпадений нет, тогда перейти на следующую страницу, и так далее, пока переменная не будет равна с элементом из списка. Если ровная, тогда кликнуть по ней.

Пример страницы:

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

Пример кода:

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

class TestPriceUa(unittest.TestCase):
	driver = None
		
	def setUp(self):
		self.driver = webdriver.Firefox()
		self.driver.implicitly_wait(60)
			
	def test_filter(self):
		#Зайти на yandex.ru
		self.driver.get("http://yandex.ru")
		#В разделе Маркет выбираю Сотовые телефоны
		self.driver.find_element_by_id("tab-market").click()
		self.driver.find_element_by_css_selector(r'.l-categories a[href="/catalog.xml?hid=91491"]').click()
		#Захожу в росширенный поиск
		self.driver.find_element_by_css_selector(r'.black').click()	
		#Задаю параметры поиска
		self.driver.find_element_by_id("f2142558003-1").send_keys('20000')
		self.driver.find_element_by_css_selector('#f2142557926 span').click()
		self.driver.find_element_by_id("f2142557926-1").send_keys('3')
		self.driver.find_element_by_css_selector('#f1801946-1871375').click()
		self.driver.find_element_by_css_selector('#f1801946-1871447').click()
		self.driver.find_element_by_css_selector('#f1801946-1871499').click()
		self.driver.find_element_by_css_selector('#f1801946-1871151').click()
		self.driver.find_element_by_css_selector('#f1801946-11756910').click()
		self.driver.find_element_by_css_selector(r'.b-gurufilters_submit-button').click()
		#Проверка, что на странице 10 элементов
		self.assertEqual(len(self.driver.find_elements_by_class_name('b-offers__info')), 10)
		#Запоминаю первый телефон в списке
		first = self.driver.find_element_by_css_selector('.results>tbody>tr>td>form>div>:first-child>div.b-offers__desc>h3>a').get_attribute('id')
		print(first)
		#Изменяю сортировку на другую(популярность или новизна)
		self.driver.find_element_by_xpath("html/body/div[3]/table/tbody/tr[2]/td[2]/div/ul[2]/li[4]/a").click()
		#Список телефонов уже с новой сортировкой
		items = self.driver.find_elements_by_xpath("//div[@class='b-offers b-offers_type_guru'] /div[@class='b-offers__desc'] /h3 /a")
		#Поиск ранее запомненного телефона
		for list in items:
			if list.get_attribute('id')!=first: 
				continue
			list.click()
			break
		else:	
			self.driver.find_element_by_css_selector('.b-pager__next').click()
	#def tearDown(self):
		#self.driver.close()
		
if __name__ == "__main__" :
	unittest.main()

Цикл с которым не могу разобраться:

first = self.driver.find_element_by_css_selector('.results>tbody>tr>td>form>div>:first-child>div.b-offers__desc>h3>a').get_attribute('id')
		print(first)
#Изменяю сортировку на другую(популярность или новизна)
		self.driver.find_element_by_xpath("html/body/div[3]/table/tbody/tr[2]/td[2]/div/ul[2]/li[4]/a").click()
#Список телефонов уже с новой сортировкой
		items = self.driver.find_elements_by_xpath("//div[@class='b-offers b-offers_type_guru'] /div[@class='b-offers__desc'] /h3 /a")
#Поиск ранее запомненного телефона
		for list in items:
			if list.get_attribute('id')!=first: 
				continue
			list.click()
			break
		else:	
			self.driver.find_element_by_css_selector('.b-pager__next').click()

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


(Александр Таранков) #2

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

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

И используй цикл while в дополнение к for, тут нужен вложенный цикл


(re1ax) #3

Здесь вам нужно использовать вложенные циклы:

  • “внешний” будет переходить по страницам
  • “внутренний” будет перебирать элементы на каждой странице
    С этим лучше разбираться самому, потому-что такое ещё не раз у вас встретится + это основы программинга. Могу посоветовать курс по Python http://www.codecademy.com/tracks/python .

(Mykhailo Poliarush) #4

Тут даже два обхода делать не нужно. Также сценарий можно значительно упростить.

Вот пример на http://wordpress.org/plugins/tags/widget

import unittest
from selenium.webdriver import Firefox

BASE_URL = r"http://wordpress.org/plugins/tags/widget"
PAGGING_MAXIMUM = 260
LOOKING_NAME = r"Instagram Slider Widget"


class TestPaggingExample(unittest.TestCase):
    def setUp(self):
        self.driver = Firefox()
        self.driver.get(BASE_URL)

    def tearDown(self):
        self.driver.quit()

    def test_pagging_page(self):
        xpath = r"//div[@class='plugin-block']" \
                r"//a[text()='{}']".format(LOOKING_NAME)
        is_found_item = False
        for index in xrange(self._get_pagging_maximum()):
            self.driver.get(r"{}/page/{}".format(BASE_URL, index))
            try:
                self.driver.find_element_by_xpath(xpath).click()
                is_found_item = True
                break
            except:
                pass
        if not is_found_item:
            raise AssertionError(
                "Didn't find item by name {}".format(LOOKING_NAME))

        #do you next logic here

    def _get_pagging_maximum(self):
        #do you logic here according to you web application
        return PAGGING_MAXIMUM


if __name__ == "__main__":
    unittest.main(verbosity=2)

@joemast дело говорит, надо учиться программировать базовые вещи, а тогда уже переходить к написанию более сложных сценариев. А так получается Вы идете в обратном направлении. Так что берите какие-нибудь курсы http://www.codecademy.com/tracks/python (англоязычные) и http://lessons2.ru/lesson/category/python/ (русскоязычные, тут есть уроки по webdriver в том числе) и учитесь.


(Олег Стасів) #5

Спасибо друзья. Я знаю, что может пошел наоборот. Однако, я выполняя задания, параллельно учу язык и начинаю понимать, что и с чем едят. Спасибо за подсказку, буду стараться. Если получится выполнить задание, выставлю решения.


(Mykhailo Poliarush) #6

Буду очень признателен, если сделаешь свою задачу, оформить ее для начинающих в виде заметки. Например, как вот здесь сделано Запуск Robot Framework из PyCharm или вот так вот Работа с конфигурационными файлами на разных окружениях, пример скрипта на Python

У меня уже была мысль ввести такую штуку - Консультации в обмен на обязательную заметку в нашей базе знаний, теперь эта мысль еще больше укрепляется :slight_smile: Надо реализовывать!


(Олег Стасів) #7

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

Еще раз спасибо за консультацию в обмен (в дальнейшем) на заметку в вашей базе знания :smile: