我想用selenium vba中的javascript填充数据
我有一个预填充数据的网络表单,我必须填写。我想用javascript实现这一点。我不确定是否要写代码我想用selenium vba中的javascript填充数据,vba,selenium,web-scraping,Vba,Selenium,Web Scraping,我有一个预填充数据的网络表单,我必须填写。我想用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
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表中的数据。在不查看网页的表和底层HTML的情况下调试XPath是很困难的,但通常如果一个表很难访问,我只使用AppRobotic之类的宏工具来利用screen 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
在不查看表格和网页的底层HTML的情况下调试XPath是很困难的,但通常情况下,如果表格很难访问,我只需使用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
我无法在VBA中测试这一点,但已经从python中翻译了一些有用的东西。我使用
evaluate
来处理xpath匹配
函数Document.evaluate()
具有以下定义:
var xpathResult = document.evaluate(
xpathExpression,
contextNode,
namespaceResolver,
resultType,
result
);
第一个参数是xpath表达式。然后,contextNode
基本上就是应用xpath的节点,即本例中的document
namespacesolver
为null
,因为没有使用名称空间前缀(它是一个html文档)。我将resultType
指定为XPathResult.ANY\u TYPE
,以便从表达式中获取自然类型。对于result
参数,我传递null
,以便创建一个新的XPathResult
返回类型为对象
。我使用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
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)
Python原创版:
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
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)
参考资料:
我无法在VBA中测试这一点,但已经从python中翻译了一些有用的东西。我使用evaluate
来处理xpath匹配
函数Document.evaluate()
具有以下定义:
var xpathResult = document.evaluate(
xpathExpression,
contextNode,
namespaceResolver,
resultType,
result
);
第一个参数是xpath表达式。然后,contextNode
基本上就是应用xpath的节点,即本例中的document
namespacesolver
为null
,因为没有使用名称空间前缀(它是一个html文档)。我将resultType
指定为XPathResult.ANY\u TYPE
,以便从表达式中获取自然类型。对于result
参数,我传递null
,以便创建一个新的XPathResult
返回类型为对象
。我使用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
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)
Python原创版:
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
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)
参考资料:
你误解我了。我认识到您可能真的想要JavaScript解决方案,这就是为什么我给出了基于JavaScript的答案。没有感情伤害:-)你误解了我。我认识到您可能真的想要JavaScript解决方案,这就是为什么我给出了基于JavaScript的答案。没有感情伤害:-)