selenium webdriver tcp/ip端口耗尽

问题描述:

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

的问题是,对于每个选项,它调用通过硒:

  • 点击选项选择
  • find_element和is_displayed 7场
  • find_elements的项目中选择框
  • get_attribute和文本在选择框中的每个选项

因此,出来(ro呃)250 *(7 * 2 + 1 + 2 * 250),或128,750个不同的请求到测试运行的webdriver服务器,所有这些都在大约10到15分钟内完成。这导致在某些情况下运行测试的机器上的客户端端口耗尽。这一切都通过一个测试框架来运行,这个框架抽象出如何解析选择框,何时创建新页面对象等几件事情,因此测试代码中的优化要么意味着黑客入侵或丢弃这个测试框架以及手动完成所有工作(为了维护我们的测试代码,这是一个坏主意)。

有些想法我已经为解决方案是:

  • 试图以某种方式集中或重复使用到的webdriver服务器的连接
  • 不知怎么调整的urllib2httplib在运行时的配置,这样的连接打开通过硒超时或更快地被杀死
  • 系统独立(或至少可用于所有带有OS交换机或类似系统的系统)用于主动跟踪和关闭由硒打开的端口的机制

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

+0

有几种方法可以解决它:1.使用HTTP 1.1保持连接并重新使用它们。 2.使客户端端口范围更大(请参阅您的操作系统文档如何,在其网上TCP TCP),3.添加一些睡眠,因为客户端端口可以在约2分钟后重新使用 – schlenk

+0

@schlenk我认为这些选项,但: 1.不确定我需要在webdriver内部调整以使用keepalive 2.增加max ports成为这些测试将运行的机器的自定义配置,使它们更便于安装并且更难以设置(并且更改超时,至少在Windows中,只能从我见过的全局完成)3.这个测试已经花费了10多分钟时间进行相对较小且简单的验证;加入睡眠,特别是如果它们没有被检测到端口耗尽至少动态触发,只会让测试的运行时间更长 –

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

+0

三年后,恐怕没有任何变化,并且这样做是如此优雅。 +1 –

有同样的问题。我会发布我的解决方案以及将来的参考(尽管它最可能不如你的,但它是基本的,我不能因此而浪费时间)。

我不知道为什么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端口,应使用方法(Checkpoint())。