Selenium Hub,启动 2 个浏览器仅在其中 1 个中运行测试(selenium python)

Selenium Hub, Launches 2 browser only runs test in 1 of them (selenium python)

TL/DR:现在它启动了 2 个浏览器,但只有 运行 是 1 中的测试。我错过了什么?

所以我试图让 selenium hub 在 mac (OS X 10.11.5) 上运行。我使用 this 安装,然后在终端选项卡中启动集线器:

selenium-standalone start -- -role hub

然后在同一个 machine 的终端的另一个选项卡中注册一个节点。

selenium-standalone start -- -role node -hub http://localhost:4444/grid/register -port 5556

它出现在 console 中,有 5 个可用的 firefox 和 chrome 浏览器。

这是我的代码。在名为 globes.py 的文件中,我有这个。

class globes:
    def __init__(self, number):
        self.number = number

    base_url = "https://fake-example.com"

    desired_cap = []
    desired_cap.append ({'browserName':'chrome', 'javascriptEnabled':'true', 'version':'', 'platform':'ANY'})
    desired_cap.append ({'browserName':'firefox', 'javascriptEnabled':'true', 'version':'', 'platform':'ANY'})
    selenium_server_url = 'http://127.0.0.1:4444/wd/hub'

现在我正尝试 运行 看起来像这样的单个测试。

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from globes import *

class HeroCarousel(unittest.TestCase):

    def setUp(self):
        for driver_instance in globes.desired_cap:
            self.driver = webdriver.Remote(
                command_executor=globes.selenium_server_url,
                desired_capabilities=driver_instance)

        self.verificationErrors = []

    def test_hero_carousel(self):
        driver = self.driver
        driver.get(globes.base_url)

        hero_carousel = driver.find_element(By.CSS_SELECTOR, 'div.carousel-featured')
        try: self.assertTrue(hero_carousel.is_displayed())
        except AssertionError, e: self.verificationErrors.append("home_test: Hero Carousel was not visible")

    def tearDown(self):
        self.driver.close()
        self.assertEqual([], self.verificationErrors)


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

现在它同时启动 Firefox 和 Chrome,但仅 运行s 在 Firefox 中进行测试。 Chrome 打开后只停留在空白页上,无法关闭。所以我认为我编写测试的方式有问题。那我错过了什么?如果这很明显,我深表歉意,但我只是在学习如何设置集线器,并且刚刚学会了 python 几周前编写 selenium 测试。

我认为 Hubs 在同时启动时工作,但我确实尝试在不同端口的同一 machine 上添加第二个节点并得到相同的结果。以防万一这是集线器打印出来的内容。

INFO - Got a request to create a new session: Capabilities [{browserName=chrome, javascriptEnabled=true, version=, platform=ANY}]
INFO - Available nodes: [http://192.168.2.1:5557]
INFO - Trying to create a new session on node http://192.168.2.1:5557
INFO - Trying to create a new session on test slot {seleniumProtocol=WebDriver, browserName=chrome, maxInstances=5, platform=MAC}
INFO - Got a request to create a new session: Capabilities [{browserName=firefox, javascriptEnabled=true, version=, platform=ANY}]
INFO - Available nodes: [http://192.168.2.1:5557]
INFO - Trying to create a new session on node http://192.168.2.1:5557
INFO - Trying to create a new session on test slot {seleniumProtocol=WebDriver, browserName=firefox, maxInstances=5, platform=MAC}

您需要使用self.driver.quit(),否则浏览器不会退出,只会关闭当前window。

您很快就会遇到多个浏览器 运行,您将不得不为它们付费。

请原谅我,因为我还没有真正使用过 selenium,所以我离题太远了,这个答案完全基于与只保留对 setUp[=16 中最后创建的驱动程序的引用相关的问题=]

而不是保留一个 self.driver 你需要有一个所有驱动程序的列表,比方说 self.drivers,然后在处理它们而不是 driver = self.driver 你会做 for driver in self.drivers: 并将所有相关代码缩进到 for 循环中,如下所示:

class HeroCarousel(unittest.TestCase):

    def setUp(self):
        self.drivers = [] #could make this with list comprehension
        for driver_instance in globes.desired_cap:
            driver = webdriver.Remote(
                command_executor=globes.selenium_server_url,
                desired_capabilities=driver_instance)
            self.drivers.append(driver)

        self.verificationErrors = []

    def test_hero_carousel(self):
        for driver in self.drivers:
            driver.get(globes.base_url)

            hero_carousel = driver.find_element(By.CSS_SELECTOR, 'div.carousel-featured')
            try: self.assertTrue(hero_carousel.is_displayed())
            except AssertionError, e: self.verificationErrors.append("home_test: Hero Carousel was not visible")

    def tearDown(self):
        for driver in self.drivers:
            driver.close()
        self.assertEqual([], self.verificationErrors)