title: How do I set up a Selenium Grid Python test case to test across multiple machines?
body: <p>I have successfully set up SeleniumGrid to run my Python tests across multiple machines that have different OS and browsers. 
  However, I am still having to write the same test case 3 times, once for each node, because the reference to the node is inside the test case.</p>
  
  <p>I've looked at all sorts of online suggestions for Python eg. seperating node ips out into external files and importing this into the test case but none of them seem to work or the instructions are for Java.</p>
  
  <p>With this one from Mozilla, I'm not sure how I set this file up with my test cases/how to run it: <a href="http://viewvc.svn.mozilla.org/vc/projects/sumo/tests/frontend/python_tests/suite_sumo.py?view=markup" rel="noreferrer">http://viewvc.svn.mozilla.org/vc/projects/sumo/tests/frontend/python_tests/suite_sumo.py?view=markup</a> </p>
  
  <p>How do I set my Python test cases up so I only write it once?</p>
  
  <p><strong>My Hub command prompt instruction is:</strong></p>
  
  <pre><code>java -jar selenium-server-standalone-2.29.0.jar -host http://localmachineipaddress -port 4444 -role hub
  </code></pre>
  
  <p><strong>My Nodes command prompt instructions are:</strong></p>
  
  <pre><code>*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   
  </code></pre>
  
  <p><strong>My Test Case command prompt instructions are:</strong></p>
  
  <pre><code>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
  </code></pre>
  
  <p><strong>My Test Case is:</strong></p>
  
  <pre><code># 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())
  </code></pre>