2013-02-20 9 views
5

Ich habe SeleniumGrid erfolgreich eingerichtet, um meine Python-Tests auf mehreren Computern mit unterschiedlichen Betriebssystemen und Browsern auszuführen. Allerdings muss ich immer noch dreimal den gleichen Testfall schreiben, einmal für jeden Knoten, weil der Verweis auf den Knoten innerhalb des Testfalls liegt.Wie richte ich einen Selenium Grid Python-Testfall ein, um ihn auf mehreren Rechnern zu testen?

Ich habe mir alle möglichen Online-Vorschläge für Python angesehen. Trennen von Knoten in externe Dateien und importieren diese in den Testfall, aber keiner von ihnen scheint zu funktionieren oder die Anweisungen sind für Java.

Mit diesem einem von Mozilla, ich bin nicht sicher, wie ich diese Datei mit meinem Testfall einrichten/wie es läuft: http://viewvc.svn.mozilla.org/vc/projects/sumo/tests/frontend/python_tests/suite_sumo.py?view=markup

Wie kann ich eine Python Testfall einrichten, so dass nur ich es schreiben Einmal?

My Hub Eingabeaufforderung Befehl:

java -jar selenium-server-standalone-2.29.0.jar -host http://localmachineipaddress -port 4444 -role hub 

Meine Knoten-Eingabeaufforderung Befehle sind:

*FireFox PC, Chrome PC, Safari PC, and IE9 PC on local machine* 
java -jar selenium-server-standalone-2.29.0.jar -host localhost -role webdriver -hub http://theHubIP:4444/grid/register -port 5555 -browser browserName=firefox,maxInstances=5,platform=WINDOWS -browser browserName=chrome,maxInstances=5,platform=WINDOWS -Dwebdriver.chrome.driver=c:\SeleniumGrid\chromedriver.exe -browser browserName=iehta,maxInstances=5,platform=WINDOWS -Dwebdriver.ie.driver=c:\SeleniumGrid\IEDriverServer.exe -browser browserName=safari,maxInstances=5,platform=WINDOWS -Dwebdriver.safari.driver=c:\Python27\SafariDriver2.28.0.safariextz  

*FireFox MAC, Safari MAC, and Chrome MAC machine* 
java -jar selenium-server-standalone-2.29.0.jar -role webdriver -hub http://theHubIP:4444/grid/register -debug -port 5556 -browser browserName=firefox,maxInstances=5,platform=MAC -browser browserName=chrome,maxInstances=5,platform=MAC -browser browserName=safari,maxInstances=5,platform=MAC -Dwebdriver.safari.driver=c:\Python27\SafariDriver2.28.0.safariextz 

*IE8 PC machine* 
java -jar selenium-server-standalone-2.29.0.jar -role webdriver -hub http://theHubIP:4444/grid/register -port 5559 -browser browserName=iehta,maxInstances=5,platform=WINDOWS -Dwebdriver.ie.driver=c:\SeleniumGrid\IEDriverServer.exe 

Mein Test Case-Eingabeaufforderung Befehle sind:

python Python27/Test_Cases/SeleniumTest.py 5555 firefox WINDOWS 
python Python27/Test_Cases/SeleniumTest.py 5555 chrome WINDOWS 
python Python27/Test_Cases/SeleniumTest.py 5555 iehta WINDOWS 
python Python27/Test_Cases/SeleniumTest.py 5555 safari WINDOWS 
python Python27/Test_Cases/SeleniumTestIE8.py 5559 iehta WINDOWS 
python Python27/Test_Cases/SeleniumTestApple.py 5556 chrome MAC 
python Python27/Test_Cases/SeleniumTestApple.py 5556 firefox MAC 
python Python27/Test_Cases/SeleniumTestApple.py 5556 safari MAC 

Mein Testfall ist:

# coding: utf-8 
from selenium import webdriver 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.keys import Keys 
import HTMLTestRunner 
import unittest, time 
import sys 

class SeleniumTest1(unittest.TestCase): 
    def setUp(self): 
    self.driver = webdriver.Remote(command_executor="http://theNodeIP:5555/wd/hub",desired_capabilities={ "browserName": browser, "platform": platform, "node":node }) 
    self.driver.implicitly_wait(2) 

def mytest(self): 
    self.driver.get("http://url.com") 
    self.driver.find_element_by_css_xpath("test_some_stuff").click() 

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

def suite(): 
    s1 = unittest.TestLoader().loadTestsFromTestCase(SeleniumTest1) 
    return unittest.TestSuite([s1]) 

def run(suite, report = "C:\\Python27\\Test_Cases\\Reports\\SeleniumTest1.html"): 
with open(report, "w") as f: 
    HTMLTestRunner.HTMLTestRunner(
       stream = f, 
       title = 'SeleniumTest1', 
       verbosity = 2, 
       description = 'SeleniumTest1' 
       ).run(suite) 

if __name__ == "__main__": 
args = sys.argv 

node=args[1] 

browser = args[2] 

platform = args[3] 

run(suite()) 
+0

Warum nicht einfach den wiederholten Testcode in Funktion bringen, z.B. def someRepeatTest (webdriver): #Ihre Codezeilen gehen hier ... –

Antwort

1

Statt die Argumente für Browser und Plattform durch Shell Aufruf geben, können Sie Ihre Python-Skript, eine Konfigurationsdatei zu lesen. Im Wesentlichen verfügen Sie über eine Konfigurationsdatei, in der die Browser aufgeführt sind, auf denen Sie eine Liste mit Plattformen ausführen möchten.

Der Trick ist, dass Sie eine Suite-Datei höherer Ebene haben müssen, die die anderen Tests mit jeder Kombination aufrufen wird. Sie benötigen also eine Suite-Datei, die diese Konfigurationsdatei für Browser- und Plattformkombinationen abfragt und Suiten mit den verschiedenen Kombinationen ausführt.

Sie können die Testausführung sogar parallelisieren, wenn Multithread-Unterstützung in Python vorhanden ist.

Zum Beispiel würde ich in Ruby meine Konfiguration aus einer .yml-Datei lesen und dann Rake-Aufrufe in mehreren Threads mit jeder Browser-Plattform-Kombination ausführen.

2

Ich konnte zwei Browser auf einmal mit dem nose_parameterized Modul testen. (Sie brauchen nicht auf die Nase Test Runner zu verwenden, um das nose_parameterized Modul zu verwenden.)

from django.test import LiveServerTestCase 
from nose_parameterized import parameterized 
from selenium import webdriver 


class UITest(LiveServerTestCase): 

    def setUp(self): 
     self.selenium = { 
      'chrome': webdriver.Chrome(), 
      'firefox': webdriver.Firefox(), 
     } 

    def tearDown(self): 
     for browser in self.selenium: 
      self.selenium[browser].quit() 

    testdata = [ 
     ('chrome',), 
     ('firefox',), 
    ] 

    @parameterized.expand(testdata) 
    def test_something(self, browser): 
     driver = self.selenium[browser] 
     # [...] 

Selenium Grid zu verwenden, wie Ihre Frage geht dahin, nur die webdrivers zum Anzug ändern.

+0

Da Sie "SeleniumGrid erfolgreich einrichten können, um meine Python-Tests auszuführen", bitte helfen Sie mir mit meinem Problem hier https://stackoverflow.com/q/45127482/ 248616. Vielen Dank! –

Verwandte Themen