如何使用 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 的隐藏元素的日期?的主要内容,如果未能解决你的问题,请参考以下文章
后台通过request.setAttribute向前台传值,前台如何去获取其中的对象或属性值