【问题标题】:issue saving / submitting a webform using selenium and python使用 selenium 和 python 保存/提交网络表单的问题
【发布时间】:2020-03-03 21:09:25
【问题描述】:

填写完所有字段后,我已经有好几天无法保存表单了。我可以点击保存按钮,但没有任何反应。页面保持原样,不显示任何已保存的内容,也没有显示运行脚本的错误。

这是网站 HTML 的摘录(它是一个内部网网站,因此公众无法访问)和我收集的 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“未定义不是构造函数”,我的按钮没有被点击或我的表单没有被保存:


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

driver.execute_script("arguments[0].click();", Saving)

然后我对此进行了测试,认为 JS 可能想要重新加载我所在的页面并可能想要“返回”一些东西。这会引发 Traceback“未定义不是构造函数”,我的按钮没有被点击或我的表单没有被保存:


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

【问题讨论】:

  • 这里的代码太多了,很难理解/理解你所问的问题出在哪里。您是说网络驱动程序按下了保存按钮,但是没有任何反应?您是否尝试过调试到该点,然后在到达该部分时尝试自己手动按下保存按钮?结果如何?
  • 这听起来像X-Y problem。与其寻求解决问题的帮助,不如编辑您的问题并询问实际问题。你想做什么?
  • 感谢@PreciseMotion。我废弃了几行代码,但留下了“saveform”功能和我要保存的表格。我正在使用无头 PhantomJS 浏览器,因此我无法自己单击按钮。但是,在 IE 中打开网站时,我可以看到当我单击保存按钮时它会执行 POST。我怀疑在 PhantomJS 中单击保存时不会发生这种情况。
  • @DebanjanB 感谢您提出问题 DebanJanB。我很想编辑这个问题。我的问题是当我点击保存按钮时没有任何反应。应该保存表单并将数据添加到表中,但没有任何反应。没有错误,什么都没有。我希望这会有所帮助。
  • @PreciseMotion 可能指向该问题的另一条评论:尝试在 Chrome 或 Firefox 中手动单击“保存”按钮时,也没有任何反应。该按钮仅在我使用 IE 时有效。

标签: javascript python html ajax selenium


【解决方案1】:

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

短存根可以快速解决: function clearDirty() { }.

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

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

  function clearDirty() { }
</script>

如果这样做,您应该能够看到您的 saveForm() 被调用。但还有其他问题,见下文。

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

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

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

我真的建议使用 html 验证器。 html 源代码看起来像是来自一个非常过时的 M$ 工具。网上有很多。我第一次使用W3C service。只需指向您的本地 html 文件并按 check

除了语言和字符编码问题之外,该工具在底部报告了缺少关闭的 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() 函数,您将看到即使单击到那时也可以工作,这也可以通过手动鼠标单击来测试。

【讨论】:

  • 谢谢@Woodz。这是一个广泛的答案,使我走上了许多道路。请问:您的意思是把
  • 有点难以理解你在做什么。您将一些硒元素混合到一些测试或自动化意图中,用于一个非常过时的站点,而该站点对世界不可用。感觉生成这个糟糕的 html 的工具(这也是错误的,如果你没有忘记将所有信息放入你原来的问题中)已经有时间了,真的没有什么可以再用它测试了。
  • 我建议,为了感受一下 selenium 在网络上的表现,制作一个简单的静态 html 表单,其中包含一个提交按钮,该按钮发布到另一个 html 文件,就像一个只有静态文本的成功页面。在浏览器中打开它并手动查看它是否符合您的预期。在这一切都好之前,你可以开始摆弄硒。我可能很快会给你一个样品......
  • 我编辑了我的答案,为您提供示例。请再次完整阅读我的答案,因为我对硒的submit 解释有误。顺便提一句。由于您隐藏了重要信息,因此您最近的问题编辑使人们更难以为您提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多