【问题标题】:Selenium Hub, Launches 2 browser only runs test in 1 of them (selenium python)Selenium Hub,启动 2 个浏览器仅在其中 1 个中运行测试(selenium python)
【发布时间】:2016-05-27 17:36:03
【问题描述】:

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

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

selenium-standalone start -- -role hub

然后在同一台机器上的另一个终端选项卡中注册一个节点。

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,但只在 Firefox 中运行测试。 Chrome 会打开,只是停留在空白页面上,不会关闭。所以我认为我编写测试的方式有问题。那么我错过了什么?如果这很明显,我深表歉意,但我只是在学习如何设置集线器,几周前刚刚学会了足够的 python 来编写 selenium 测试。

我认为集线器在启动两者时都能正常工作,但我确实尝试在同一台机器上的不同端口上添加第二个节点并得到相同的结果。以防万一这就是中心打印出来的内容。

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 = ... 在 for 循环中只会保留对最后一个的引用...
  • 所以它会启动 chrome 并将 self.driver 设置为 webdriver.Remote,然后用 firefox 的实例覆盖 self.driver,从而丢失对 chrome 实例的引用。
  • 感谢您的评论,这似乎可以解释它,但我如何启动多个 Webdriver 实例并保持它们链接。我有点想关注这个example 但并不真正了解Java,所以我不明白为什么我的与它不同。我见过人们只是在命令行中传入浏览器但people 建议反对的例子。
  • 我还看到人们指定 driver1 和 driver2 然后为每个浏览器复制他们的测试,但似乎必须有比这更好的方法。

标签: python selenium automated-tests selenium-grid qa


【解决方案1】:

如果我还没有真正使用过硒,请原谅我,这个答案纯粹是基于与仅在setUp 中保留对最后创建的驱动程序的引用相关的问题

而不是保留一个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)

【讨论】:

    【解决方案2】:

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

    您很快就会运行多个浏览器,并且您必须为它们付费。

    【讨论】:

    • 感谢您的提示,但这无助于它不在 Chrome 中运行测试,窗口未关闭的原因是因为测试未在 chrome 中运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多