使用selenium和python保存/提交网络表单时出现问题



我已经好几天没能在填写完所有字段后保存表单了。我可以点击保存按钮,但什么也没发生。页面保持原样,不会显示任何已保存的内容,也不会显示运行脚本时出现的错误。

以下是该网站的HTML摘录(这是一个intranet网站,因此公众无法访问(和我收集的python代码摘录。

我测试了几种不同的提交方式(xx.click((、xx.submit((、execute_script((等(,但都没有成功。我还尝试调用javascript而不是单击按钮,但这也不起作用。如有任何帮助,我们将不胜感激。

  • 这里是网页的HTML摘录:

<INPUT onclick=clearDirty();javascript:saveForm(); class=button type=button 
value=Save> 
  • ,这里是我尝试使用但没有成功的Python脚本:

saving = driver.find_element_by_xpath ('//input[@value = "Save"]')
saving.click()

我还测试了通过selenium执行JS。这抛出了一个Traceback"undefined is not a constructor",我的按钮没有被点击,或者我的表单没有保存:


Saving = driver.find_element_by_xpath('//input[@value = "Save"]')
driver.execute_script("arguments[0].click();", Saving)

然后我测试了这个,认为JS可能想重新加载我所在的页面,并且可能想"返回"一些东西。这抛出了一个Traceback"undefined is not a constructor",我的按钮没有被点击,或者我的表单没有保存:


nextpage = driver.execute_script("return arguments[0].click();", Saving)
print ("NEXTPAGE:", nextpage, type(nextpage))

保存按钮的onclick属性中有两个函数。第一个clearDirty()没有定义。这导致js解释器在出现此错误时立即停止,并且不会继续执行第二个函数saveForm()

短存根可以很快解决问题:function clearDirty() { }

我建议将函数定义saveForm()加上clearDirty()存根放在脚本标记之间,如下所示:

<script>
function saveForm() {
...
}
function clearDirty() { }
</script>

如果你这样做,你应该能够看到你的saveForm()被呼叫。但还有其他问题,请参阅下文。

作为另一个测试,您甚至可以从保存按钮的onclick属性中删除函数clearDirty();。然后您可以看到saveForm()函数被正确调用。

表单被提交到action属性指定的位置。如果没有这样的属性或其值为空,则会将其发布到自身。在您的情况下,位置将为:OBS/financial_model_tp_labor_otc.htm

如果将元素的submit函数与selenium一起使用,则会绕过所有表单按钮,并通过解析表单的action属性立即提交表单本身。无论您的按钮和js配置如何,这都应该在任何时候都有效。如果没有,那么您生成的html确实有问题。

我真的建议使用html验证器。html源代码看起来像是来自一个非常过时的M$工具。网里有很多东西。我第一次使用W3C服务。只需指向您的本地html文件,然后按检查

除了语言和字符编码问题外,该工具在底部报告了缺少的关闭html标记。

请双引号引用您的属性值,中有特殊字符

编辑

我会给你一个小样品。首先创建2个html文件,如下所示。

ta.html:

<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<style>
.bkon {
background-color: darkgreen !important;
}
</style>
</head>
<body style="font-family:helvetica;text-align:center">
<div id="frmdiv" style="margin:2em;padding:2em;background-color:lightsalmon;border: solid grey .5em;border-radius:.5em">
<p>
Find the button below which gets the form posted away
</p>
<form action="succ.html" method="post">
<input type="button" value="Save" onclick="clearDirty();btnclk()" />
</form>
</div>
<script>
function btnclk() {
var dv = $("#frmdiv");
if(! dv.hasClass("bkon")) {
dv.addClass("bkon");
}
else {
dv.removeClass("bkon");
}
}
</script>
</body>
</html>

succ.html:

<!DOCTYPE html>
<html>
<head>
</head>
<body style="font-family:helvetica">
<div style="font-size:2em;background-color:lightgreen;text-align:center;margin-top:2em;padding:.5em;">
<p>
you got the form submitted successfully
</p>
</div>
<p>
<a href="ta.html">go back</a>
</p>
</body>
</html>

然后你可以进行这样的硒测试:

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("file:///path/to/test/your/ta.html")
btn = driver.find_element_by_xpath('//input[@value = "Save"]')
time.sleep(2)
btn.click()
time.sleep(2)
btn.submit()

在测试中,我以两种方式使用表单按钮。首先,只需调用按钮的单击功能,这相当于鼠标单击。其次,使用其提交功能。

我故意在按钮的onclick属性中添加了您可疑的clearDirty()函数,以向您显示selenium的单击失败,但提交通过。从onclick属性中删除clearDirty()函数,您将看到即使单击也能工作,这也可以通过手动鼠标单击进行测试。

最新更新