- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用IE在vba中创建了一个脚本,以不断单击位于网页底部的Load more hits
按钮,直到没有剩下这样的按钮为止。
这是我的脚本填充该按钮的方式:在网站的登录页面中,有一个名为Type
的下拉列表。脚本可以单击该Type
展开dropdown
,然后单击选项中的某些corporate bond
复选框。最后,它单击apply
按钮以填充数据。但是,该load more hits
按钮现在可以在底部看到。
我的脚本几乎可以按照我上面描述的那样执行几乎所有步骤。我唯一要解决的问题是,单击该按钮3/4次后,脚本似乎卡住了。
如何纠正我的脚本,以继续单击该Load more hits
按钮,直到没有剩余的按钮为止?
Website link
到目前为止,我已经尝试过:
Sub ExhaustLoadMore()
Dim IE As New InternetExplorer, I As Long
Dim Html As HTMLDocument, post As Object, elem As Object
Dim CheckBox As Object, btnSelect As Object
With IE
.Visible = True
.navigate "https://www.boerse-stuttgart.de/en/tools/product-search/bonds"
While .Busy Or .readyState < 4: DoEvents: Wend
Set Html = .document
Do: Loop Until Html.querySelectorAll(".bsg-loader-ring__item").Length = 0
Html.querySelector("#bsg-filters-btn-bgs-filter-3").Click
Do: Set CheckBox = Html.querySelector("#bsg-checkbox-3053"): DoEvents: Loop While CheckBox Is Nothing
CheckBox.Click
Set btnSelect = Html.querySelector("#bsg-filters-menu-bgs-filter-3 .bsg-btn__label")
Do: Loop While btnSelect.innerText = "Close"
btnSelect.Click
Do: Loop Until Html.querySelectorAll(".bsg-loader-ring__item").Length = 0
Do: Set elem = Html.querySelector(".bsg-table__tr td"): DoEvents: Loop While elem Is Nothing
Do
Set post = Html.querySelector(".bsg-searchlist__load-more button.bsg-btn--juna")
If Not post Is Nothing Then
post.ScrollIntoView
post.Click
Application.Wait Now + TimeValue("00:00:05")
Else: Exit Do
End If
Loop
End With
End Sub
Sub ExhaustLoadMore()
Const Url$ = "https://www.boerse-stuttgart.de/en/tools/product-search/bonds"
Dim driver As New ChromeDriver, elem As Object, post As Object
With driver
.get Url
Do: Loop Until .FindElementsByCss(".bsg-loader-ring__item").count = 0
.FindElementByCss("#bsg-filters-btn-bgs-filter-3", timeOut:=10000).Click
.FindElementByXPath("//label[contains(.,'Corporate Bond')]", timeOut:=10000).Click
.FindElementByXPath("//*[@id='bsg-filters-menu-bgs-filter-3']//button", timeOut:=10000).Click
Do: Loop Until .FindElementsByCss(".bsg-loader-ring__item").count = 0
Set elem = .FindElementByCss(".bsg-table__tr td", timeOut:=10000)
Do
Set post = .FindElementByCss(".bsg-searchlist__load-more button.bsg-btn--juna", timeOut:=10000)
If Not post Is Nothing Then
post.ScrollIntoView
.ExecuteScript "arguments[0].click();", post
Do: Loop Until .FindElementsByCss("p.bsg-searchlist__info--load-more").count = 0
Else: Exit Do
End If
Loop
Stop
End With
End Sub
最佳答案
我研究了您的网站,并且由于无法将所有这些都都发表在一个评论中,所以我决定发布一个答案(即使它没有提供具体的解决方案,但仅提供了“答案”,也许一些技巧)。
您问题的答案
我如何纠正我的脚本,以继续单击该“加载更多点击”按钮,直到没有剩余的按钮为止?
不幸的是,这不是你的错。您定位的网站正在通过Web客户端(您的浏览器)和Web服务器之间的WebSocket通信工作,并提供您要抓取的价格。您可以看到如下:
像这样想象:
首次加载网页时,将初始化Web套接字并发送第一个请求(Web客户端:“嘿,服务器,请给我我的第一个X结果”,Web服务器:“当然,到这里开始”)。
每次单击“加载更多结果”按钮时,Web客户端(重要:重新使用相同的WS连接)都会不断向Web服务器请求X个新结果。
因此,通信持续进行了一段时间。有时,您无法控制Web套接字的死机。在单击“加载更多结果”按钮时查看JavaScript控制台就足够了:您将看到请求正在进行,直到在某个时候您不仅看到了NullPointerException
:
如果单击例外之前堆栈的最后一行,您将看到是由于Web套接字造成的:
该错误明确说明:cannot read .send() on null
,表示_ws
(Web套接字)已消失。
从现在开始,您可以忘记您的网站。当您单击按钮“加载更多结果”时,Web客户端将要求Web套接字将新请求传递到Web服务器,但是Web套接字已经消失了,两者之间的通信太远了,因此(不幸地)告别了。其余数据。
您可以通过在堆栈中靠前一点来验证这一点:
如您在上面看到的,我们有:
在发布新数据请求之前,在控制台中记录了一条消息,内容为“ performSearch params ...”。
新数据请求的post
刚发布新的数据请求后,在控制台中记录了一条消息,内容为“执行了搜索并显示了结果...”)
当Web套接字仍处于活动状态时,每次您单击“加载更多结果”时,您都会在控制台中看到以下两条消息(其他消息则显示在其其余代码中):
但是,在Web套接字第一次崩溃后,无论您尝试单击该按钮多少次,您都只会收到第一条消息(Web客户端发送请求),而永远不会收到第二条消息(请求在无效):
请注意,这与您在VBA中观察到的行为相对应:
单击该按钮3/4次后,脚本似乎卡住了。
它不会卡住,实际上您的脚本可以继续正确执行。是网站超时。
我试图弄清楚为什么Web套接字崩溃了,但是没有运气。似乎只是超时(我在调试其JavaScript时遇到了很多事情,所以我的断点导致了超时),但我无法确定这是唯一的原因。由于您不控制Web客户端和Web服务器之间的过程,因此您所要做的就是希望它不会超时。
另外,我相信使用Selenium会自动设置一些较长的超时时间(由于执行时间长),因此可以使Web套接字在超时方面更加容忍。
我发现在Web套接字崩溃后恢复连接的唯一方法是完全重新加载网页并从头开始重新启动该过程。
我的建议
我认为您可能会构建一个XHR请求并通过JavaScript发送,因为它们的API(Web客户端/ Web套接字通过该API将请求传递到Web服务器)已在其前端代码中公开了。
如果打开他们的文件FinderAPI.js
,您将看到他们离开了端点,并且对API配置进行了编码:
var FinderAPI = {
store: null,
state: null,
finderEndpoint: '/api/v1/bsg/etp/finder/list',
bidAskEndpoint: '/api/v1/prices/bidAsk/get',
instrumentNameEndpoint: '/api/products/ProductTypeMapping/InstrumentNames',
nameMappingEndpoint: '/api/v1/bsg/general/namemapping/list',
apiConfig: false,
initialize: function initialize(store, finderEndpoint) {
var apiConfig = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
this.store = store;
this.state = store.getState();
this.apiConfig = apiConfig;
this.finderEndpoint = finderEndpoint;
},
POST
请求发送到的URL。
GET
:
XmlHttpRequest
并发送其中的值以直接在您的VBA中检索价格,而无需打开网页和自动抓取。
FinderAPI.js
的断点开始,行66(代码行是
this.post(this.finderEndpoint, params)
,
params
应该将您引向请求的正文-我记得您可以使用< cc>)。
JSON.stringify(params)
个,它们也会使用
50
个结果的分页。换句话说,如果您将值500(而不是50)扫入发送给API的请求的分页属性中:
关于vba - 无法让我的脚本继续使用IE单击“加载更多”按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55069943/
我正在开发一个带选项卡栏的 ios 应用程序。我的栏上有超过 5 个按钮,所以在 iphone 上我有更多的按钮。现在,假设我有这个按钮:Button1 Button2 Button3 Button4
我有一个带有 UITabBarController 的应用,其中有超过五个选项卡。 当我按更多选项卡时,我会转到moreNavigationController,它是一个UINavigationCon
我有一个导航 Controller 。 NAVC->MORE... 按钮,然后在“更多”下有一些额外的 VC。 如果我转到“更多...”下的 VC,然后转到不在“更多...”上的 VC,那么当我返回到
因此,我想出了这种方案,用于在多个线程同时具有读写访问权限的二叉树中旋转时锁定节点,这涉及每次旋转锁定四个节点,这似乎是一个很多吗?我想到了一种比我想出的方法更聪明的方法来减少所需的锁定,但谷歌并没有
所以我已经尝试了所有方法,但我似乎仍然无法将下拉内容与 dropbtn 对齐。我只希望内容始终位于更多菜单下方。 HTML: `
我正在尝试使用 expect 来自动接受在 --more-- 中提示的 EULA。 #!/usr/bin/expect spawn "./greenplum-perfmon-web-4.1.2.0-b
他们如何在下面提供的网站上制作“告诉我更多”效果。我读过 read more/less effect in jQuery,但我发现该站点的有趣之处在于,除非单击该按钮,否则无法滚动页面。 Effect
现在,Kim Stebel helped me understanding如何使用存在类型键入变量,我需要知道如何在继承中使用它们: 以下代码无法编译: class PagingListModel(s
在我的Cygwin中不可用。另一方面,提供了“ less”命令。也许Cygwin的制造商认为“更多”只是多余的。 我对此很好奇。 最佳答案 安装util-linux软件包,您将获得“更多”的信息 ht
基本上,我想知道是否有人有增加 DTU 与分片的经验。 DTU应该线性地提高性能。因此,如果您有 5 个 DTU,而您改为 10 个 DTU,那么(理论上)您应该获得大约两倍的性能。 因此,四个 SQ
我们使用 asp.net mvc、javascript 和 jQuery(托管在本地计算机上)创建了一个应用程序。基本设计是,当用户从一个页面导航到其他页面时,我们通过隐藏和显示 HTML 页面,将所
我想用 RMonad 做一些基本的事情。有没有办法使用“as monad”功能来 有一个身份 rmonad,可以应用 monad 转换器吗? 有诸如 StateT 变压器之类的常见东西吗? 向现有 m
我有一个 char*[] 数组。我需要能够为其分配字符串并再次删除它们,但我不知道: 如何检查一个元素中是否已经有一个字符串,这样我就不会覆盖它,如果它已经被占用,则继续处理下一个元素? 之后如何将其
基本上,我想知道是否有人有增加 DTU 与分片的经验。 DTU应该线性地提高性能。因此,如果您有 5 个 DTU,而您改为 10 个 DTU,那么(理论上)您应该获得大约两倍的性能。 因此,四个 SQ
我有一个程序可以同时吐出标准错误和标准输出,我想在标准错误上少运行寻呼机,但忽略标准输出。我该怎么做? 更新: 就是这样......我不想丢失标准输出......只是让它远离寻呼机 program 2
基本上,当单击具有类 "dropdown" 的链接时,我无法获取“更多...”链接来对下一个跨度的高度进行动画处理。它根本就没有动画。仅当更改为 Less... 链接并且单击 Less... 链接以折
我正在使用 ExtJS,并认为它是一个了不起的框架。但是,它们没有内置的状态图,这使得依赖于状态的应用程序开发非常痛苦。 我最近发现了这个: https://github.com/jakesgordo
我一直在研究数据结构和算法,遗憾的是在C中。我已经单独实现了一个双向链表,它保存整数并且工作正常,但是当节点(或pub)让它正常工作时我遇到了很多麻烦在本例中)保存多个不同类型的值。我可以创建一个列表
编辑拼写错误 你好, 这可能是一个愚蠢的问题,但如果它能帮助我遵循最佳实践,我不在乎:P 假设我想在 System.Data 命名空间...以及 System.Data.SqlClient 命名空间中
使用 bootstrap 3 CSS、font awesome CSS 和最新的 jQuery JS 文件。 我正在使用 javascript 在单击按钮时在另一个内容 div 之上隐藏/显示一个内容
我是一名优秀的程序员,十分优秀!