Селен: выполнение третьей функции после первых двух завершенных - PullRequest
0 голосов
/ 28 ноября 2018

Я использую Selenium Webdriver с Firefox для запуска своего кода.Я использую pytest, чтобы я мог запускать функции параллельно.У меня есть три основные функции: первая и вторая функция возвращают что-то, а третья функция использует данные из предыдущих функций. Моя проблема в том, что я хочу выполнить третью функцию с данными, возвращенными из двух функций после завершения первых двух функций.

Сам код на самом деле намного сложнее, но для пояснения я сделалновый код, который демонстрирует мою проблему.У меня есть две функции, одна называется «test1», а другая - «test2» - обе они работают параллельно и возвращают информацию.У меня также есть третья функция с именем «test3» для обработки данных, возвращаемых из test1 и test2, как только они оба завершены.В этом примере «comp» должен просто распечатать некоторый текст.

Вот код:

import unittest
from time import sleep
from selenium import webdriver

# pytest -s -v tests.py        <----- I use to execute this script
# py.test -s tests.py -d --tx 2*popen//python=python2.7    <------- I     use this to run the tests in parallel
# For some reason program doesnt print in parallel mode. Although "-s" fixes that in the normal execution of pytest.


class TestParallel(unittest.TestCase):


def setUp(self):
    self.browser = webdriver.Firefox(executable_path='./dependencies/geckodriver')


def test1(self):
    browser = self.browser
    browser.get('https://www.google.com/')
    asd = browser.find_element_by_xpath("/html/body/div/div[3]/div[1]/div/div/div/div[1]/div[1]/a").text # returns "Gmail"
    sleep(2)
    print asd
    return asd

def test2(self):
    browser = self.browser
    browser.get('https://www.google.com/')
    asd2 = browser.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/div/div/div/div[1]/div[2]/a").text # returns "Images"
    sleep(1)
    print asd2
    return asd2

def test3(self):
    print "word from test1 is " + TestParallel.test1(self) + " and word from test2 is " + TestParallel.test2(self)


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


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

Может быть, у кого-то есть идеи / предложения относительно того, как я мог бы решить эту проблему.Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

test1 и test2 на самом деле не похожи на тесты ... они выглядят так, как будто они должны быть функциями, которые возвращают данные со страницы, которые используются в тесте.Я бы сделал что-то более похожее на

def get_thing1(self):
    return self.browser.find_element_by_xpath("/html/body/div/div[3]/div[1]/div/div/div/div[1]/div[1]/a").text # returns "Gmail"

def get_thing2(self):
    return self.browser.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/div/div/div/div[1]/div[2]/a").text # returns "Images"

def test1(self):
    browser = self.browser
    browser.get('https://www.google.com/')

    print "word from test1 is " + get_thing1(self) + " and word from test2 is " + get_thing2(self)

Эти два метода, get_thing1 и get_thing2, предполагают, что вы находитесь на правильной странице, и все, что они делают, это возвращают то, что вы ищете.Пожалуйста, измените имена на более описательные ... Я не был уверен, что именно они возвращали, поэтому я придумал какое-то общее имя.

Теперь у вас есть только test1, который работает, и два метода, которые тянут вещисо страницы.Вы можете запускать test1 столько раз, сколько захотите ... параллельно и т. Д. ... в цикле или как угодно.

Дополнительные примечания:

  1. Вына самом деле не хочу использовать XPath с таким большим количеством уровней, которые начинаются с тега HTML.Они очень хрупкие (могут сломаться при любом небольшом изменении в HTML).
  2. Вам нужно некоторое время, чтобы прочитать об объектной модели страницы.Вам следует создать объект страницы GoogleSearchResultsPage, и в этом объекте страницы должны быть get_thing1() и get_thing2().После проверки вы перейдете из GoogleSearchPage в GoogleSearchResultsPage и затем вызовете эти два метода и т. Д., Чтобы получить данные со страницы.
0 голосов
/ 28 ноября 2018

Редактировать

Хорошо, вот еще одна идея:

  • Объявите две пустые глобальные строковые переменные перед выполнением test1 и test2.
  • Пусть test1 и test2 записывают в эти две переменные
  • Пусть test3 ожидает в цикле while, пока обе переменные не содержат что-то или пока не пройдет определенное количество времени.

    class TestParallel(unittest.TestCase):
    
    string_a = ""
    string_b = ""
    
    def setUp(self):
        self.browser = webdriver.Firefox(executable_path='./dependencies/geckodriver')
    
    def test1(self):
        [..]
        string_a = "result_a"
    
    def test2(self):
        [..]
        string_b = "result_b"
    
    def test3(self):
        counter = 0;
        while ("" in string_a && "" in string_b):
            sleep(0.1)
            counter = counter + 1
            if counter > 200:
                break
    
    print "word from test1 is " + string_a + " and word from test2 is " + string_b
    

Хмм, возможно:

def test3(self):
    counter = 0;
    while ("" in string_a && "" in string_b):
        sleep(0.1)
        counter = counter + 1
        if counter > 1000:
            break

    print "word from test1 is " + string_b + " and word from test2 is " + string_b
...