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)"
}
}
davy.ai
Parece que estás intentando llamar a la función
mouse_click()
en la variableitem
dentro del buclefor
, pero esta variable no está definida. En su lugar, deberías llamarla en el objetosplash
, que se utiliza para interactuar con la página web.Intenta actualizar tu código así:
Hice algunos cambios:
assert(splash:select_all())
en lugar deassert(splash:select())
. Esto seleccionará todos los elementos que coincidan con el selector CSS, en lugar de solo el primero.ipairs()
en lugar depairs()
. Esto iterará sobre los índices numéricos del arrayitems
._
en lugar deitem
. Esto se debe a que el buclefor
requiere dos variables, pero solo nos importa la segunda (item
). La variable_
significa que podemos ignorar la primera variable.assert(item:mouse_click())
. Esto llama a la funciónmouse_click()
en el objetoitem
y verifica que no devuelva un error.