我已经在vba中结合selenium编写了一个脚本,以解析网页中所有可用的公司名称。该网页已启用了惰性加载方法,因此每个滚动中仅可见20个链接。如果滚动2次,则可见的链接数为40,依此类推。该网页上有1000个链接。我下面的脚本可以到达该页面的底部,处理所有滚动并获取该网页中所有可用的名称。
但是,必须在每次滚动之后等待一定时间,以便该网页更新内容。这是我使用过的地方,hardcoded delay
但硬编码过程却非常不一致,有时它会使浏览器在整个操作完成之前退出。
如何修改此部分.Wait 6000
以Explicit 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
定义 超时 (将允许经过的指定时间段)以摆脱硬编码的延迟。超时需要进行硬编码。
此代码与原始代码之间的区别是:
码:
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上的