Excel VBA使用Knockout控制网页; 似乎工作; 但什么都没有得救

Bry*_*ies 8 javascript excel vba javascript-events knockout.js

摘要:

基本上尝试使用Excel VBA编辑网站.编辑似乎有效,但是当我使用保存按钮时,不保存任何内容.我知道保存按钮有效,如下所述.那么为什么我的更新数据不会在屏幕上显示?

故事:

我有这个代码,我已经使用Excel VBA工作了一段时间.它在Internet Explorer中打开一个网页,在我想要的地方导航,填写一大堆数据,所有数据都显示在屏幕上,使用各种方法,例如:

For Each objElement In objElementColl
ExtractedName = objElement.outerHTML

If InStr(ExtractedName, "NewPermit") > 0 Then
objElement.Checked = True
Run Code Online (Sandbox Code Playgroud)

Set DropDown = objHTML.getElementById("ProjectFile-AccreditedCertifierId")
DropDown.selectedIndex = 1
Run Code Online (Sandbox Code Playgroud)

要么

objHTML.getElementsByName(ElementName)(0).Value = ValueCheck
Run Code Online (Sandbox Code Playgroud)

所有这些都能很好地工作,并在屏幕上进行更改.然后我使用以下命令单击保存:

Set objElementColl = objHTML.getElementsByClassName("btn")

For Each objElement In objElementColl
    ExtractedName = objElement.outerHTML

    If InStr(ExtractedName, "click: save, enable:") > 0 Then
        objElement.Click
        ExtractedName = 1
        Exit For
    End If
Next
Run Code Online (Sandbox Code Playgroud)

哪个再次正常.问题是它实际上并没有从上面的3个代码中保存我的更改.我试过的是

a)暂停我的代码并手动点击保存(同一问题)

b)暂停我的代码,手动更改复选框并运行代码进行保存(保存手动更改,但不保存编码的代码)

c)暂停代码并手动更改框并手动保存(仅保存手动更改的框)

因此,从上面看,我的保存点击似乎有效,但由于某种原因,尽管使用代码可以明显更改框并填写,但可见和背景之间存在差距.

无论如何,一些HTML源代码.在检查我正在改变的元素时,Chrome会显示什么:

    <fieldset>
        <legend>Proposal</legend>

        <div class="col-xs-12 col-sm-8 col-md-6">
            <div class="row">
                <div class="col-xs-2 form-group">
                    <label for="ProjectFile_ProposalLot">Lot</label><input class="form-control" data-bind="textInput: ProjectFile().ProposalLot" maxlength="100" name="ProjectFile-ProposalLot" type="text" />
                </div>
                    <div class="col-xs-2 form-group" data-bind="visible: ProjectFile().StateId() != 7 && ProjectFile().StateId() != 5">
                        <label data-bind="text: ProjectFile().ProposalDpLabel()"></label>
                        <input class="form-control" data-bind="textInput: ProjectFile().ProposalDp" maxlength="100" name="ProjectFile-ProposalDp" type="text" />
                        </div>
Run Code Online (Sandbox Code Playgroud)

我还搜索了页面的整个源代码......我相信这可能很重要,但我不是HTML编码器.我把它缩短了一点

var ProjectFileEditViewModel=(function(){__extends(ProjectFileEditViewModel,ViewModel.Model);function ProjectFileEditViewModel(){ProjectFileEditViewModel.__super__.constructor.apply(this,arguments);};ProjectFileEditViewModel.prototype.fields=function(){return {"Id":new ViewModel.NumberField(0),"StateId":new ViewModel.NumberField(0),"DefaultOfficeAddressId":new ViewModel.ObservableField(),"Name":new ViewModel.ObservableField(),"ExistingApprovalDate":new ViewModel.DateField("DD/MM/YYYY"),"ProjectClosed":new ViewModel.ObservableField(),"ProposalAddress":new ViewModel.ObservableChildField(exports.AddressViewModel,this),"Zoning":new ViewModel.ObservableField(),"ProposalLot":new return ProjectFileEditViewModel;})();if(exports.ProjectFileEditViewModel==null)exports.ProjectFileEditViewModel=ProjectFileEditViewModel;
Run Code Online (Sandbox Code Playgroud)

还有这个......再多一点:

Buildaform.model=new Buildaform.ProjectPageViewModel({ ... ,"ProposalLot":null .... }
Run Code Online (Sandbox Code Playgroud)

我认为这最后一个与它有关,我不知道我是否可以改变它.

对于坏消息,我无法公开发布网站地址或源代码.但请PM我,我可以解决一些问题.

Rob*_*zie 1

根据您的评论:

  1. 暂停我的代码,手动更改复选框并运行代码以保存(确实保存手动更改,但不保存编码的更改

问题似乎出在设置表单控件的代码上,而不是单击“保存”按钮的代码上。

这似乎是一个与VBA无关的问题,但与淘汰赛的行为有关- 请参阅此 SO 帖子。相关评论是:

您的问题是 ko 订阅了已检查绑定内的单击事件:

该帖子中的提问者遇到了与您类似的问题 - 他们试图选中一个复选框(以更改视图),但它没有更新视图模型或底层模型本身。Knockout 是一个MVVM框架。

您问题中的泄露是您的手动更改提交,因为您在浏览器中通过点击执行操作时执行了单击并更改,但您的编程方法仅对表单控件进行了更改,但是不是点击第一。

那么,如何通过 IE 通过 VBA 自动化解决这个问题呢?

根据我上面引用的帖子中的解决方案,加上这里的方法,我将冒险使用下面的代码作为可能的解决方案,但请注意它未经测试......

基本上,您需要“单击”要更改的表单元素 - 然后更新控件值。希望“点击”位意味着淘汰视图模型会根据“更改”进行更新,并且从那里,模型数据将被写入数据库(或其他):

您的复选框示例:

If InStr(ExtractedName, "NewPermit") > 0 Then
// hopefully this will get knockout to apply the required binding before your change the value
objElement.Click
objElement.Checked = True
Run Code Online (Sandbox Code Playgroud)

您的下拉示例:

Set DropDown = objHTML.getElementById("ProjectFile-AccreditedCertifierId")
// hopefully this will get knockout to apply the required binding before your change the value
Dropdown.Click
DropDown.selectedIndex = 1
Run Code Online (Sandbox Code Playgroud)

希望有帮助 - 完全是 3 管问题!祝你好运。