2017-02-11 22 views
1

我目前使用的硒与Python 2.7和我试图插入密码以下形式目前存在的标识:硒蟒蛇:如何发送键隐藏密码与

<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> 

我试着使用下面的代码,但我保留收到​​一个错误,而试图EXCUTE清除命令:

 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 

我不确定这是否与焦点或改变元素的模糊有关,但是我得到元素并且无法处理它。

在此先感谢!

更新:下一行解决了我的情况下(仍然不知道为什么它不工作):

driver.execute_script('document.getElementById("Irealpass").setAttribute("value","myPassword");') 

这样,我也没必要使用passBoxElement在所有或改变显示风格。

+0

上提供的线路,你得异常? – Andersson

+0

on passElement.clear() – mk010

回答

0

根据文档http://selenium-python.readthedocs.io,此代码应该工作。 elem = driver.find_element_by_css_selector("#mockpass input:first-child")

如果您仍然收到错误,请将浏览器窗口滚动到您尝试访问的元素。

+0

它没有工作,它就像我会尝试将密码发送到passBoxElement(我需要发送它的passElement)。 – mk010

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

有一件事要注意,从JS第二个INPUT它看起来像是你的价值是空的,它将重新隐藏第二个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") 
0

下面应该工作:

passwdEle = self.driver.find_element(by='id', value='Irealpass') 
self.driver.execute_script('arguments[0].setAttribute("value","****")', passwdEle)