【问题标题】:JavaScriptException in execute_script methodexecute_script 方法中的 JavaScriptException
【发布时间】:2022-01-26 12:58:15
【问题描述】:
def send(self, message):
    try:
        textArea = self.driver.find_element_by_xpath("//textarea[@placeholder='Message...']")
        textArea.clear()
        self.driver.execute_script("arguments[0].value='" + message + "'", textArea) # Error right here
        textArea.send_keys(Keys.SPACE)
        sendButton = self.driver.find_element_by_xpath("//button[contains(text(), 'Send')]").click()

    except NoSuchElementException or StaleElementReferenceException as ex:
        print("Исключение в send()")
        print(ex)

到目前为止,第五行工作正常,但现在我无法弄清楚问题出在哪里。并且变量具有正确的值。

File "D:\PROJECTS\BLD_Project\main.py", line 187, in send
    self.driver.execute_script("arguments[0].value='" + message + "'", textArea)
  File "D:\PROJECTS\INST\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 878, in execute_script
    return self.execute(command, {
  File "D:\PROJECTS\INST\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
    self.error_handler.check_response(response)
  File "D:\PROJECTS\INST\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.JavascriptException: Message: javascript error: Unexpected identifier

【问题讨论】:

  • message 是否恰好包含引号、换行符或其他“特殊”字符?
  • @Thomas 你能提供一个特殊字符列表吗?看来你是对的。
  • @Thomas 消息包含写为 \' 的引号字符

标签: javascript python selenium


【解决方案1】:

你似乎遇到了逃避麻烦。如果message 包含引号字符,例如O'Hara,您最终会在执行的JavaScript 代码中出现语法错误:

arguments[0].value='O'Hara'

solution 是使用您已经在使用的arguments 数组,同时传递message 字符串:

self.driver.execute_script("arguments[0].value = arguments[1]", textArea, message)

【讨论】:

  • 我很难理解这种行为,我到底哪里出错了?
  • 此外,我运行我给出的代码,使用多种特殊字符组合,它在这些情况下也确实有效。
  • 你明白为什么arguments[0].value='O'Hara' 是个问题吗?
【解决方案2】:

假设message 是一个字符串,您可以在execute_script 中使用setAttribute,如下所示:

textArea = self.driver.find_element_by_xpath("//textarea[@placeholder='Message...']")
self.driver.execute_script(f"arguments[0].setAttribute('value', '{message}')", textArea)

message 变量传递给textArea 网络元素。

更新:

【讨论】:

  • 它没有解决问题。如果原始代码给出了语法错误,那么这个也是。
  • @Thomas:我没有看到任何语法错误,我创建了一个带有输入标签的 sample.html 文件,并且可以使用我上面提到的带有 execute_script 的 selenium 脚本更新输入字段。它确实有效并且没有抛出任何语法错误。
  • 如果您没有看到任何语法错误,那么您首先无法重现 OP 的问题。再次阅读问题。如果在 Python 代码中设置 message = "O'Hara" 会发生什么?
  • @Thomas:自己看,更新截图。
  • 他在self.driver.execute_script("arguments[0].value='" + message + "'", textArea) # Error right here 这一行遇到了问题,我可以解决这个问题,我不是在这里让你同意这一点,但我不认为你应该否决这个答案。因为这确实有效。
猜你喜欢
  • 2020-05-30
  • 2020-06-15
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多