【问题标题】:Headless browser and locust.io无头浏览器和 locust.io
【发布时间】:2015-12-29 15:54:34
【问题描述】:

是否可以将无头浏览器与蝗虫集成?我需要我的负载测试来处理在每个页面加载时触发额外请求的客户端脚本。

【问题讨论】:

  • 我也有同样的需求——我在 python 中有很多 selenium 脚本,想使用 locust.io 对它们进行负载测试

标签: locust


【解决方案1】:

我认为 locust 不是为此目的而设计的,它是用于创建并发用户来发出 http 请求,所以我没有看到与 locust 和浏览器的任何集成。但是,您可以通过在header 中发送额外信息来模拟浏览器,这样客户端脚本也可以工作。

r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0]), 'User-Agent': self.user_agent})

【讨论】:

    【解决方案2】:

    理论上,您可以让无头浏览器成为 Locust 奴隶/工人。但问题是浏览器在 CPU 和内存方面的成本要高得多,这将使其难以扩展

    这就是为什么 Locust 使用 small greenlets 来模拟用户,因为它们的构建和运行成本要低得多。

    我建议您分解页面的请求并将它们编码为 Locust 内部的请求。 Chrome 开发工具中的网络选项卡可能是一个好的开始。我还听说有人通过记录所有请求的代理来捕获这些请求。

    【讨论】:

      【解决方案3】:

      您可以使用无浏览器之类的东西来托管 Chrome (https://browserless.io)。根据您对负载测试的残酷程度,存在不同程度的并发。完全免责声明:我是无浏览器服务的制造者

      【讨论】:

        【解决方案4】:

        解决此问题的蝗虫方法是向您的测试添加更多请求,以模仿 javascript 代码将发出的请求。

        我构建我的 locust 测试以解析来自应用工作流程中早期请求的 JSON 响应。然后,我从该 JSON 中随机挑选一些有趣的数据,然后发出更多请求,模拟用户单击该数据时浏览器中会发生的情况。

        【讨论】:

          【解决方案5】:

          这是一个老问题,但我现在遇到了,并在“realbrowserlocusts”(https://github.com/nickboucart/realbrowserlocusts) 中找到了解决方案 - 它使用 selenium 添加了“Real Browser support for Locust.io load testing”。

          如果您将其类之一(FirefoxLocust、ChromeLocust、PhantomJSLocust)而不是 HttpLocust 用于您的 locust 用户类

          class WebsiteUser(HeadlessChromeLocust):
          

          然后在您的TaskSet self.client 成为selenium WebDriver 的一个实例


          对我来说一个缺点是 webdriver(与 HttpLocust 中的内置客户端不同)不知道“主机”,这会强制在 TaskSet 中使用绝对 URL 而不是相对 URL,并且在以下情况下使用相对 URL 真的很方便使用不同的环境(本地、开发、登台、产品等)。 但是有一个简单的解决方法:从 realbrowserlocusts 的蝗虫之一继承并将“主机”传递给 WebDriver 实例:

          from locust import TaskSet, task, between
          from realbrowserlocusts import HeadlessChromeLocust
          
          
          class UserBehaviour(TaskSet):
              @task(1)
              def some_action(self):
                  # self.client is selenium WebDriver instance
                  self.client.get(self.client.base_host + "/relative/url")
                  # and then for inst. using selenium methods:
                  self.client.find_element_by_name("form-name").send_keys("your text")
                  # etc.
          
          
          class ChromeLocustWithHost(HeadlessChromeLocust):
              def __init__(self):
                  super(ChromeLocustWithHost, self).__init__()
                  self.client.base_host = self.host
          
          
          class WebsiteUser(ChromeLocustWithHost):
              screen_width = 1200
              screen_height = 1200
              task_set = UserBehaviour
              wait_time = between(5, 9)
          

          ============

          2020 年 9 月 5 日更新:

          我在 2020 年 3 月发布了此解决方案,当时 locust 的主要版本为 0。此后,在 2020 年 5 月,他们发布了 1.0.0 版,其中进行了一些向后不兼容的更改(其中之一 - 将 StopLocust 重命名为 StopUser) . realbrowserlocusts 有一段时间没有更新,也没有更新到 locust >=1。

          不过有一个解决方法。 发布 locust v1.0.0 时,以前的版本以新名称发布 - locustio,最后一个版本是 0.14.6,所以如果你安装“locustio== 0.14.6”(或“locustiohttps://github.com/nickboucart/realbrowserlocusts/issues/13)。

          您必须限制 locustio 的版本,因为没有它它会拒绝安装:

          pip install locustio
          ...
          ERROR: Command errored out with exit status 1:
          ...
          **** Locust package has moved from 'locustio' to 'locust'.
          Please update your reference
          (or pin your version to 0.14.6 if you dont want to update to 1.0)
          

          【讨论】:

          • 在我看来,这是一个很受欢迎的答案。非常感谢@augur!
          • 目前似乎无法使其工作,针对 locust 1.0.3,未发现异常问题:` File "~/.pyenv/versions/3.8.2/lib/python3 .8/site-packages/realbrowserlocusts/core.py",第 6 行,在 中 from locust.exception import StopLocust ImportError: cannot import name 'StopLocust' from 'locust.exception' (~/.pyenv/versions/3.8 .2/lib/python3.8/site-packages/locust/exception.py)`
          • @williamfalconeruk,我检查并找到了原因。我在 2020 年 3 月发布了这个解决方案,当时 locust 的主要版本为 0。从那时起,在 2020 年 5 月,他们发布了 1.0.0 版,其中进行了一些向后不兼容的更改(其中之一 - 将 StopLocust 重命名为 StopUser)。 realbrowserlocust 有一段时间没有更新,也没有更新到 locust >=1。
          • @williamfalconeruk 不过有一个解决方法。当 locust v1.0.0 发布时,以前的版本以新名称发布 - locustio,最后一个版本是 0.14.6,所以如果你安装“pip install locustio==0.14.6”,那么使用 realbrowserlocusts 的解决方案就可以了。我会用评论更新解决方案。 (第二部分不适合一条评论)
          • 2021 年 12 月返回:ImportError: cannot import name 'StopLocust' from 'locust.exception' (C:\Python38\lib\site-packages\locust\exception.py)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 2018-03-16
          • 2011-04-28
          • 2013-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多