【问题标题】:How to use javascript with selenium python如何将 javascript 与 selenium python 一起使用
【发布时间】:2016-05-31 09:54:29
【问题描述】:

我正在尝试使用 python selenium 执行javascript。我基本上是在尝试使用execute.script 设置值,但不知何故它什么也没做。我想编辑街道地址,如下所示

execute_script(driver, """var element = document.getElementsByClassName('input[ng-model="formData.address.address1"]'); element.value = '328 91st Street'; """)

谁能告诉我这里有什么问题?我也没有收到错误

【问题讨论】:

  • 如果你不知道......getElementsByClassName 会返回一个数组......所以你必须做 element[0] (如果你想要第一个元素)
  • 有什么办法可以打印出元素数组吗?我收到一个错误WebDriverException: Message: unknown error: Cannot set property 'value' of undefined
  • 你可以像console.log(element)一样调试,你会得到数组...
  • 我刚刚更新了答案...您应该使用querySelector 而不是getElementsByClassName

标签: javascript python selenium selenium-webdriver css-selectors


【解决方案1】:

有一种更强大的方法 - 使用 CSS 选择器使用 selenium 定位元素,并将 WebElement 以及一个值作为参数传递到脚本中:

elm = driver.find_element_by_css_selector('input[ng-model="formData.address.address1"]')
value = '328 91st Street'

driver.execute_script("arguments[0].value = 'arguments[1]';", elm, value)

请注意,在您的代码中,您有两个主要问题:

  • 您将 CSS 选择器传递给 getElementsByClassName() 调用 - 相反,它希望您将类名作为字符串传递
  • getElementsByClassName() 返回一个元素数组而不是单个元素

【讨论】:

    【解决方案2】:

    这段代码几乎可以运行了...

    execute_script(driver, """var element = document.getElementsByClassName('input[ng-model="formData.address.address1"]'); element.value = '328 91st Street'; """)

    请记住getElementsByClassName 将返回一个数组...

    我猜你应该使用 querySelectorquerySelectorAll 函数...

    // will select just one element 
    var element = document.querySelector('input[ng-model="formData.address.address1"]'); 
    
    // will select all elements
    var element = document.querySelectorAll('input[ng-model="formData.address.address1"]'); 
    

    getElementsByClassName你应该通知一个班级......(我认为很难有这样一个班级:ng-model="formData.address.address1"

    使用querySelector

    var element = document.querySelector('input[ng-model="formData.address.address1"]'); element.value = '328 91st Street';//Work!!!

    如果您想使用querySelectorAll 在这些节点列表中进行迭代

    基本上,

    var element = document.querySelectorAll('input[ng-model="formData.address.address1"]'); element.value = '328 91st Street';//WON'T WORK

    改为:

    var element = document.querySelectorAll('input[ng-model="formData.address.address1"]'); element[0].value = '328 91st Street'; // change the value for the first element

    for(int i = 0 ;i<element.length;i++){ //change all elements
       element[i].value =  '328 91st Street';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2014-04-23
      • 2020-01-29
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2013-07-19
      • 2017-01-11
      相关资源
      最近更新 更多