如何使用 setAttribute 方法和 Selenium 和 Python 更改 Datepicker 的隐藏元素的日期?

Posted

技术标签:

【中文标题】如何使用 setAttribute 方法和 Selenium 和 Python 更改 Datepicker 的隐藏元素的日期?【英文标题】:How to change the date of a hidden element of a Datepicker using setAttribute method and Selenium with Python? 【发布时间】:2021-03-11 20:27:34 【问题描述】:

几天来,我一直在努力寻找一种方法来使用 Selenium 和 Python 设置日期选择器的日期。 我发现有一个带有日期的隐藏元素,所以我尝试使用 javascript 执行器为该隐藏元素设置一个值。我尝试了不同的方法,脚本似乎执行得很好,但日期没有改变。

我的脚本如下所示:

#input date by using hidden date method 1
element = browser.find_element_by_xpath("/html[1]/body[1]/div[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[2]/td[1]/table[1]/tbody[1]/tr[1]/td[2]/input[1]")
browser.execute_script("arguments[0].setAttribute('value', '0')".format("2019-10-31"), element )
element.submit()

#input date by using hidden date method 2
date = "2019-10-31"
element= browser.find_element_by_xpath("/html[1]/body[1]/div[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[2]/td[1]/table[1]/tbody[1]/tr[1]/td[2]/input[1]")
browser.execute_script('arguments[0].setAttribute("value", "%s")' % date, element)
element.submit()

网站的HTML代码和图片如下:

日期选择器的 HTML:

日期选择器元素:

编辑:

更新了 HTML,隐藏元素可见

【问题讨论】:

我想说你要做的远非理想——它基本上是在修改测试中的隐藏/私有行为,这在任何类型的测试中通常都是一个坏主意。但是无论如何,要回答您的问题,您是否尝试过设置该值?那是表单发送的内容,而不是元素属性。 eg:browser.execute_script('arguments[0].value = "%s"'...(至于为什么不应该,你可以自己看:你发现很难调试这个案例) @Official_Ali 是可以测试的公开网站吗? @Christian 我尝试了您指出的代码,但没有任何改变。 browser.execute_script('arguments[0].value = "%s"' % date, element) @DebanjanB 不,不幸的是它不是:/ 【参考方案1】:

<input> 元素的 type 属性设置为 hidden。您可以编辑/删除 type 属性并设置值如下:

element = browser.find_element_by_xpath("/html[1]/body[1]/div[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[2]/td[1]/table[1]/tbody[1]/tr[1]/td[2]/input[1]")
browser.execute_script("arguments[0].removeAttribute('type')", element)
new_element = browser.find_element_by_xpath("/html[1]/body[1]/div[1]/form[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[2]/td[1]/table[1]/tbody[1]/tr[1]/td[2]/input[1]")
browser.execute_script("arguments[0].setAttribute('value','2019-10-31')", new_element)

参考文献

您可以在以下位置找到一些相关的详细讨论:

How to Change a html line code with python Selenium Datepicker using JavascriptExecutor Is there a way to add a new attribute with a value to an element using selenium python?

【讨论】:

我尝试了您的建议,代码有效,并且您在网站上的输入框中看到了一个新元素,但日期没有改变。我尝试将 setAttribute 更改为 value,但这也不起作用。 browser.execute_script("arguments[0].Value = '2019-10-31'", new_element) @Official_Ali 不是新元素而是隐藏元素。当 <input> 元素可见时,您可以使用基于文本的 HTML 来更新问题吗? 刚刚用 HTML 可见元素的屏幕截图更新了我的问题 @Official_Ali 查看更新的答案并让我知道状态。 刚刚重新测试,工作正常。最初它对我不起作用,因为我忘记了切换框架。您的代码完美无缺,谢谢

以上是关于如何使用 setAttribute 方法和 Selenium 和 Python 更改 Datepicker 的隐藏元素的日期?的主要内容,如果未能解决你的问题,请参考以下文章

SEl和IMP

如何在 perl $sel->click 下使用 Selenium 点击 Javascript

runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)

Objective-C中的SEL (转载)

iOS开发基础知识--碎片45

将方法作为 SEL 参数传递给另一个类方法