2017-02-11 10 views
1

Я в настоящее время использую селен с Python 2.7 и я пытаюсь вставить пароль в следующей форме:селена питон: как отправить ключи к скрытому паролю с Differnet идентификаторами

<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 

Я не уверен, что это связано с фокусом или размытием, которое меняет элемент, но я получаю элемент и не могу его использовать.

Заранее благодарен!

обновление: следующая строка решить мой случай (до сих пор не знаю, почему он не работает):

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-коде, который вы предоставили. Вы можете видеть это во 2-м TR, style="display: none;". Если вы посмотрите в HTML первого INPUT, вы увидите, что onfocus скрывает первый TR

onfocus="document.getElementById('mockpass').style.display='none'; 

, а затем вновь вывести 2-й 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)