硒:在前两个完成后执行第三个功能

时间:2018-11-27 22:54:14

标签: python selenium parallel-processing webdriver pytest

我在Firefox中使用Selenium Webdriver来运行我的代码。我正在使用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 :(得分:0)

修改

好,这是另一个主意:

  • 在test1和test2之前声明两个空的全局字符串变量 跑。
  • 已将test1和test2写入这两个变量
  • 已测试3 等待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

答案 1 :(得分:-1)

test1test2看起来并不像测试……它们看起来应该是从测试中使用的页面返回数据的函数。我会做更多类似的事情

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_thing1get_thing2假定您在正确的页面上,而它们所做的只是返回您要查找的内容。请将名称更改为更具描述性的名称...我不确定它们到底返回了什么,所以我组成了一些通用名称。

现在,您只有test1可以运行,还有两个方法可以从页面中提取内容。您可以根据需要……并行运行test1多次,等等。……循环运行或任意运行。

附加说明:

  1. 您真的不想使用深度很多和/或以HTML标记开头的XPath。它们非常脆弱(可能对HTML所做的任何细微改动都会破坏它。)
  2. 您应该花一些时间来了解页面对象模型。您应该创建一个GoogleSearchResultsPage页面对象,并将get_thing1()get_thing2()放在该页面对象中。然后,您将进行测试,将其从GoogleSearchPage升级到GoogleSearchResultsPage,然后调用这两个方法等,以从该页面获取数据。