Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想用selenium vba中的javascript填充数据_Vba_Selenium_Web Scraping - Fatal编程技术网

我想用selenium vba中的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

我有一个预填充数据的网络表单,我必须填写。我想用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表中的数据。

在不查看网页的表和底层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的答案。没有感情伤害:-)