我目前正在使用selenium和python 2.7,并且我试图在以下表单中插入密码:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li class="has-sub">
<a href="briefing.html">
<img src=images/plane.png id=menu-icons>Flight Briefing<span class="sb-arrow"></span>
</a>
<ul>
<li>
<a href="flightlog.html">
<img src="images/share.png" id="menu-icons">Flight Log</a>
</li>
<li>
<a href="loadsheet.html">
<img src="images/weight.png" id="menu-icons">Loadsheet</a>
</li>
<li>
<a href="#">
<img src="images/compass.png" id="menu-icons">Alternates</a>
</li>
<li>
<a href="#">
<img src="images/listing-option.png" id="menu-icons">Operational Flightplan</a>
</li>
</ul>
</li>
我尝试使用以下代码,但在尝试执行clear命令时仍然遇到错误:
<tr id="mockpass">
<td>
<input type="text" value="something1" onfocus="document.getElementById('mockpass').style.display='none';
document.getElementById('realpass').style.display=''; document.getElementById('Irealpass').focus();">
</td>
</tr>
<tr id="realpass" style="display: none;">
<td>
<input type="password" name="Password" id="Irealpass" onblur="if(this.value=='') {document.getElementById('mockpass').style.display='';
document.getElementById('realpass').style.display='none';}">
</td>
</tr>
错误:
passBoxXpath='//*[@id="mockpass"]/td/input'
passBoxElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(passBoxXpath))
passBoxElement.click()
passElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath('//*[@name="Password"]'))
passElement = driver.execute_script("arguments[0].style.display = 'block'; return arguments[0];",
passElement)
passElement.clear()
passElement.send_keys("myPassword")
我不确定它是否与改变元素的焦点或模糊有关,但是我得到了元素并且没有对它产生影响。
提前致谢!
更新:下一行解决了我的情况(仍然不知道它为什么不起作用):
raise exception_class(message, screen, stacktrace)
InvalidElementStateException: Message: Element is not currently interactable and may not be manipulated
通过这种方式,我根本不需要使用passBoxElement或更改显示样式。
答案 0 :(得分:0)
根据文档http://selenium-python.readthedocs.io,此代码应该有效。
elem = driver.find_element_by_css_selector("#mockpass input:first-child")
如果您仍然收到错误,请将浏览器窗口滚动到您尝试访问的元素。
答案 1 :(得分:0)
有几件事......
首先,如果您尝试执行用户方案,则要避免使用JavascriptExecutor
(JSE)。 JSE允许您在实际用户无法访问的页面上执行操作。除非您必须或不关心用户场景,否则请避免使用JSE。
问题是您想要的input
隐藏在您提供的HTML中。您可以在第二个TR
,style="display: none;"
中看到它。如果您查看第一个INPUT
的HTML,您会看到onfocus
隐藏了第一个TR
onfocus="document.getElementById('mockpass').style.display='none';
然后取消隐藏第二个TR
document.getElementById('realpass').style.display='';
所以你需要做的是集中第一个INPUT
,这将展示第二个INPUT
。
有一点需要注意,从第二个INPUT
中的JS看起来,如果你的值是空的,它将重新隐藏第二个INPUT
并暴露第一个(撤消你刚刚做的)。
onblur="if(this.value=='') {docum ...
我会做这样的事情
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable(By.XPATH, '//*[@id="mockpass"]/td/input')).click()
wait.until(EC.element_to_be_clickable(By.XPATH, '//*[@id="Irealpass"]')).send_keys("myPassword")
答案 2 :(得分:0)
下面应该工作:
passwdEle = self.driver.find_element(by='id', value='Irealpass')
self.driver.execute_script('arguments[0].setAttribute("value","****")', passwdEle)