2

我正在使用 selenium webdriver(用 Python 编写)进行一套测试。正在测试的页面包含一个表单,该表单根据在其中一个选择框中选择的值更改其显示字段。这个选择框有大约 250 个选项。我有一个测试(通过鼻子运行,尽管这可能无关紧要),它遍历选择框中的所有选项,验证表单是否为每个选定的选项显示了正确的字段。

问题在于,对于每个选项,它都通过 selenium 调用:

  • 单击以选择选项
  • 7 个字段的 find_element 和 is_displayed
  • 选择框中项目的 find_elements
  • 选择框中每个选项的 get_attribute 和文本

因此,在大约 10 或 15 分钟内,对运行测试的 webdriver 服务器产生了(大约)250 * (7 * 2 + 1 + 2 * 250) 或 128,750 个不同的请求。在某些情况下,这会导致运行测试的机器上的客户端端口耗尽。这一切都是通过一个测试框架运行的,该框架抽象出诸如如何解析选择框、何时创建新页面对象以及其他一些内容,因此测试代码中的优化要么意味着将所有内容都搞砸,要么扔掉这个测试的框架并手动完成所有事情(为了我们测试代码的可维护性,这是一个坏主意)。

我对解决方案的一些想法是:

  • 试图以某种方式汇集或重用与 webdriver 服务器的连接
  • 以某种方式调整urllib2httplib在运行时的配置,以便由 selenium 超时打开的连接或更快地被杀死
  • 系统独立(或至少可用于所有具有 OS 开关或类似系统的系统)机制,用于主动跟踪和关闭 selenium 打开的端口

正如我上面提到的,我无法调整页面的解析或处理方式,但我确实可以控制子类化/调整WebDriverRemoteConnection任何我喜欢的方式。有没有人对如何处理上述任何想法或我没有提出的任何想法有任何建议?

4

3 回答 3

2

在尽可能多的塑料炸药解决忘记你家钥匙的问题中,我实施了一个解决方案。我创建了一个类,它跟踪资源列表及其添加时间,达到限制时阻止,并在其时间戳超过超时值时删除条目。然后,我创建了一个此类设置的实例,限制为 32768 个资源,超时时间为 240 秒,并让我的测试框架在每次webdriver.execute()调用或其他一些操作(db 查询、REST 调用)时向列表添加一个条目执行。它不是特别优雅,而且相当随意,但至少到目前为止,它似乎使我的测试不会触发端口耗尽,而不会显着减慢以前没有导致端口耗尽的测试。

于 2012-10-17T18:33:07.653 回答
0

有同样的问题。我也会发布我的解决方案以供将来参考(虽然它很可能不如你的好,但它是基本的,我不能浪费我的时间在这上面)。

我不知道为什么 Selenium 会为每个 javascript 调用创建新的套接字。听起来像架构问题。

这使得任何类型的爬取都非常困难,并且也会导致冗长的集成测试失败。

一些潜在的修复:

1) 开始使用 linux - 我在某处读到一个家伙仅在 Windows 系统上出现此端口耗尽。显然,这不是一个好的解决方案。

2) 按照 msdn 文章避免 tcp/ip 端口耗尽,这是为我做的。https://msdn.microsoft.com/en-us/library/aa560610(v=bts.20).aspx

也就是说,你应该增加MaxUserPort和减少TcpTimedWait。这些可以在没有管理员访问权限的情况下进行修改,也许您的测试可以包括对这些设置的注册表检查。

3) 创建新类,让旧的 tcp 连接终止:

public class LoanCrawlerSpeedController : ILoanCrawlerSpeedController
{
    private DateTime _lastCheckpointTime = DateTime.Now;

    public void Checkpoint()
    {
        var currentCheckpointTime = DateTime.Now;
        if (currentCheckpointTime - _lastCheckpointTime > TimeSpan.FromSeconds(30))
        {
            Thread.Sleep(TimeSpan.FromSeconds(32));
            _lastCheckpointTime = DateTime.Now;
        }
    }
}

每个触发新 tcp/ip 端口的 selenium 调用都应使用该方法(Checkpoint())。

于 2015-07-19T08:21:03.923 回答
-1

在 selenium repo 中创建了一个问题: https ://github.com/SeleniumHQ/selenium/issues/4162 内部有一些解决方法:

选项1

选项2

于 2019-05-08T11:46:45.220 回答