我有一个预先填写的数据的网络表格,我必须填写。我想用javascript做到这一点。我不确定要编写代码。
Public Sub ABC()
Dim document As HTMLDocument
Dim bot As New WebDriver
Dim cSCRIPT,m
m=58
bot.Start "chrome", ""
bot.Get "https://XYZ"
cSCRIPT = "document.getElementByXPath("//td[contains(text(),'XXXX')]/following-sibling::td[5]").value='" & m & "'"
bot.ExecuteScript cSCRIPT
但是我的代码不起作用。如何借助XPath在Selenium VBA中进行编码,以将数据填充到Web表中。
答案 0 :(得分:2)
我无法在VBA中对此进行测试,但已从有效的python进行了翻译。我使用evaluate
处理xpath匹配。
函数Document.evaluate()
具有以下定义:
var xpathResult = document.evaluate(
xpathExpression,
contextNode,
namespaceResolver,
resultType,
result
);
第一个参数是xpath表达式。那么contextNode
基本上是将xpath应用于document
的节点。 namespaceResolver
为null
,因为未使用名称空间前缀(这是html文档)。我将resultType
指定为XPathResult.ANY_TYPE
,以便从表达式中获取自然类型。对于result
参数,我传递了null
,以便创建一个新的XPathResult
。
返回类型为object
。我使用iterateNext
到input
元素,然后用input.value = "abc";
分配视觉值,并用input.setAttribute('value', 'xyz');
分配实际值。
我正在使用一个可测试的示例,但您将按照html进行修改,这意味着您的xpath将是
//td[contains(text(),'XXXX')]/following-sibling::td[5]/input
VBA:
Dim s As String
s = "var td = document.evaluate(""//tr[contains(td/text(), 'Angelica Ramos')]/td[2]/input"", document, null, XPathResult.ANY_TYPE, null);" & _
"var input = td.iterateNext();" & _
"input.value = 'abc';" & _
"input.setAttribute('value', 'xyz');"
bot.Get 'https://datatables.net/examples/api/form.html'
bot.ExecuteScript s
Python原始版本:
bot.get('https://datatables.net/examples/api/form.html')
s = '''var td = document.evaluate("//tr[contains(td/text(), 'Angelica Ramos')]/td[2]/input", document, null, XPathResult.ANY_TYPE, null);
var input = td.iterateNext();
input.value = 'abc';
input.setAttribute('value', 'xyz');
'''
bot.execute_script(s)
参考文献:
答案 1 :(得分:0)
调试XPath很难不看到网页的表格和底层HTML,但是通常如果表格难以访问,我只是使用AppRobotic这样的宏工具来利用表格的屏幕X,Y坐标进行点击并填写必要的信息,有时在表格中使用键盘笔触进行导航也很有效:
Set Waiter = CreateObject("Selenium.Waiter")
Set Assert = CreateObject("Selenium.Assert")
Set bot = CreateObject("Selenium.FirefoxDriver")
Set x = CreateObject("AppRobotic.API")
Sub ABC
' Open webpage
bot.Get "https://www.google.com"
' Wait a couple of seconds
x.Wait(2000)
' Type in the Search box
bot.FindElementByName("q").SendKeys "test"
bot.Keys.Return
' Or use coordinates if an element is difficult to find
' Use UI Item Explorer to get X,Y coordinates of Search box and move cursor
x.MoveCursor(438, 435)
' click inside Search box
x.MouseLeftClick
x.Type("test")
x.Type("{ENTER}")
While Waiter.Not(Instr(bot.Title, "test")): Wend
x.MessageBox("Click OK to quit the browser"):
bot.Quit
End Sub