es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lua: “error”: “intento de llamar al método ‘mouse_click’ (un valor nulo)”

Soy nuevo en Lua y estoy tratando de iterar sobre todos los enlaces de “items” utilizando un bucle “for” y hacer clic en todos los enlaces usando la función “mouse_click()”. Pero arroja el siguiente error: “error”: “intento de llamar al método ‘mouse_click’ (un valor nulo)”. ¿Cómo puedo hacer eso? He probado el código mencionado a continuación por mí mismo, pero puede faltar algo. Según la documentación, encontré que Lua tiene dos tipos de bucles “for”: Numérico y Genérico. Pero para iterar a través de los enlaces y luego hacer clic en ellos, ¿qué debo usar?

Una vez más, soy muy nuevo en Lua. Solo estoy tratando de familiarizarme con él, así que estoy buscando la guía de todos los expertos.

function main(splash, args)

  splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")
  splash.private_mode_enabled = false
  assert(splash:go(args.url))
  assert(splash:wait(3))

  items = assert(splash:select("div.item-list-content a"))

  for item in pairs(items) do
    item:mouse_click()
    assert(splash:wait(5))
  end

  splash:set_viewport_full()
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end

Salida

{
    "error": 400,
    "type": "ScriptError",
    "description": "Ocurrió un error al ejecutar el script de Lua",
    "info": {
        "source": "[string \"function main(splash, args)\r...\"]",
        "line_number": 11,
        "error": "intento de llamar al método 'mouse_click' (un valor nulo)",
        "type": "LUA_ERROR",
        "message": "Error de Lua: [string \"function main(splash, args)\r...\"]:11: intento de llamar al método 'mouse_click' (un valor nulo)"
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando llamar a la función mouse_click() en la variable item dentro del bucle for, pero esta variable no está definida. En su lugar, deberías llamarla en el objeto splash, que se utiliza para interactuar con la página web.

    Intenta actualizar tu código así:

    function main(splash, args)
    
      splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")
      splash.private_mode_enabled = false
      assert(splash:go(args.url))
      assert(splash:wait(3))
    
      items = assert(splash:select_all("div.item-list-content a"))
    
      for _,item in ipairs(items) do
        assert(item:mouse_click())
        assert(splash:wait(5))
      end
    
      splash:set_viewport_full()
      return {
        html = splash:html(),
        png = splash:png(),
        har = splash:har(),
      }
    end
    

    Hice algunos cambios:

    • utiliza assert(splash:select_all()) en lugar de assert(splash:select()). Esto seleccionará todos los elementos que coincidan con el selector CSS, en lugar de solo el primero.
    • utiliza ipairs() en lugar de pairs(). Esto iterará sobre los índices numéricos del array items.
    • utiliza _ en lugar de item. Esto se debe a que el bucle for requiere dos variables, pero solo nos importa la segunda (item). La variable _ significa que podemos ignorar la primera variable.
    • utiliza assert(item:mouse_click()). Esto llama a la función mouse_click() en el objeto item y verifica que no devuelva un error.

Comments are closed.