selenium python:如何使用不同的ID将密钥发送到隐藏密码

时间:2017-02-11 12:11:01

标签: python html selenium login passwords

我目前正在使用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或更改显示样式。

3 个答案:

答案 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中。您可以在第二个TRstyle="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)