当前位置: 首页 > 面试题库 >

无法摆脱脚本中的硬编码延迟

岳正阳
2023-03-14
问题内容

我已经在vba中结合selenium编写了一个脚本,以解析网页中所有可用的公司名称。该网页已启用了惰性加载方法,因此每个滚动中仅可见20个链接。如果滚动2次,则可见的链接数为40,依此类推。该网页上有1000个链接。我下面的脚本可以到达该页面的底部,处理所有滚动并获取该网页中所有可用的名称。

但是,必须在每次滚动之后等待一定时间,以便该网页更新内容。这是我使用过的地方,hardcoded delay但硬编码过程却非常不一致,有时它会使浏览器在整个操作完成之前退出。

如何修改此部分.Wait 6000Explicit Wait代替Hardcoded Wait

到目前为止,这是我写的:

Sub Getlinks()
    Dim driver As New ChromeDriver, prevlen&, curlen&
    Dim posts As Object, post As Object

    With driver
        .get "http://fortune.com/fortune500/list/"
        prevlen = .FindElementsByClass("company-title").Count

        Do
            prevlen = curlen
            .ExecuteScript ("window.scrollTo(0, document.body.scrollHeight);")

            .Wait 6000  ''I like to kick out this hardcoded delay and use explicit wait in place

            Set posts = .FindElementsByClass("company-title")
            curlen = posts.Count
            If prevlen = curlen Then Exit Do
        Loop

        For Each post In posts
            R = R + 1: Cells(R, 1) = post.Text
        Next post
    End With
End Sub

问题答案:

定义 超时 (将允许经过的指定时间段)以摆脱硬编码的延迟。超时需要进行硬编码。

此代码与原始代码之间的区别是:

  • 循环本身一遍又一遍地运行(每次迭代不等待6秒),并检查是否有新内容,直到找到新内容或达到超时为止。
  • 如果延迟加载花费的时间比预期的要长,例如在将数字21加载到50时,循环将“等待”并尝试获取超时中定义的最大时间的新内容。
  • 缺点:在加载所有内容的最后一步,循环将花费与设置超时相同的秒数。

码:

Sub Getlinks()
    Dim driver As New ChromeDriver, prevlen&, curlen&
    Dim posts As Object, post As Object
    Dim timeout As Integer, startTime As Double

    timeout = 10 ' set the timeout to 10 seconds

    With driver
        .get "http://fortune.com/fortune500/list/"
        prevlen = .FindElementsByClass("company-title").Count

        startTime = Timer ' set the initial starting time

        Do
            .ExecuteScript ("window.scrollTo(0, document.body.scrollHeight);")
            Set posts = .FindElementsByClass("company-title")
            curlen = posts.Count
            If curlen > prevlen Then
                startTime = Timer ' reset start time if new elements found
                prevlen = curlen ' set new prevlen
            End If
        Loop While Round(Timer - startTime, 2) <= timeout ' check if timeout is reached

        For Each post In posts
            R = R + 1: Cells(R, 1) = post.Text
        Next post
    End With
End Sub


 类似资料:
  • 问题内容: 这两个功能都可以使用,但是我正在使用这是一个不好的做法,因为某些下拉列表和文本字段将比其他字段需要更长的时间来填充,因此我必须使用最长的睡眠值才能避免错误,如何解决这些问题2个功能使用等待。 问题答案: 当你正在调用的 WebElement 项目 ,理想情况下,你应该调用 WebDriverWait 与 EC 的,所以你必须: 更换: 与: 作为下拉需要更长的时间来填补,所以你应该调用

  • 问题内容: 我正在尝试更新服务器上的用户位置 使用此功能 这是代表 我有Optional(“”)和和变量,不能摆脱它。 任何想法如何做到这一点? 问题答案: 如果您像这样解开纬度和经度值… …然后您可以在函数中完全避免使用可选: 没错…除非您有充分理由强制拆开它们,否则应该养成安全地解开可选内容的习惯。而且,仅尝试摆脱可选内容以使代码可以编译并不是一个很好的理由。

  • 我有JavaWebService代码在我的eclipse。我使用了@WebService@Webmethod,@XmlElements,@XmlType,@XmlAccessorType 现在我正在使用cxf框架中的java2ws命令生成wsdl。这是命令 我的wsdl文件包含agr0作为我不想要的名称,因为当我将其导入SoapUI时。它正在字段周围添加标记。 下面是带有arg0的wsdl部分 下

  • 问题内容: 我正在使用express在nodejs上运行服务器。我似乎无法摆脱标题: 我想知道是否有任何方法可以摆脱此标头,还是我必须忍受它? 问题答案: 在Express> = 3.0.0rc5中: 这是一个简单的中间件,可以删除早期版本的Express中的标头:

  • 问题内容: 我正在使用Apache Derby嵌入式数据库在Maven项目中进行单元测试。不幸的是,每当运行测试时,我最终都会在项目根目录中找到该文件。数据库本身是在目录()中创建的,因此这不是问题。在查阅参考指南之后, 我尝试在JDBC url()上设置参数,但这似乎是针对其他日志的,因此仍然会出现。 任何帮助深表感谢。 问题答案: 您可以通过创建以下类来摆脱文件 并设置JVM系统属性,例如,使

  • 在这段代码中,我从\u RETURN\u VALUE得到了\u SOME\u PATH\u上的