2016-08-07 3 views
3

Selenium Webdriver를 사용하여 사이트에 로그인하고 있습니다. 여러 다른 선택자를 시도하고 암시 적 대기를 시도했지만 요소를 찾을 수 없습니다. Selenium - Login raise ElementNotVisibleException

from selenium import webdriver 
    from selenium.webdriver.common.by import By 

    browser = webdriver.Firefox() 
    url = "https://www.example.com" 
    login_page = browser.get(url) 

    username = browser.find_element_by_id("Email") 
    # Also tried: 
    # username = browser.find_element_by_xpath('//*[@id="Email"]') 
    # username = browser.find_element_by_css_selector('#Email') 
    username.send_keys("email") 

다음은 HTML

<div class="form-group"> 
    <label for="Email">Email address</label> 
    <div class="input-group" style="width: 100%"> 
     <input class="form-control email" data-val="true" data-val-length="Maximum length is 50" data-val-length-max="50" data-val-regex="Provided email address is not valid" data-val-regex-pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$" data-val-required="Email is required" id="Email" name="Email" type="email" value=""><br> 
     <span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> 
    </div> 
</div> 

입니다 어떤 도움도 대단히 감사하겠습니다 오류 메시지

Traceback (most recent call last): 
    File "seleniumloginpi.py", line 12, in <module> 
    email.send_keys('email') 
    File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 320, in send_keys 
    self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)}) 
    File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 461, in _execute 
    return self._parent.execute(command, params) 
    File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with 
Stacktrace: 
    at fxdriver.preconditions.visible (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/[email protected]/components/command-processor.js:10092) 
    at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/[email protected]/components/command-processor.js:12644) 
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/[email protected]/components/command-processor.js:12661) 
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/[email protected]/components/command-processor.js:12666) 
    at DelayedCommand.prototype.execute/< (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/[email protected]/components/command-processor.js:12608) 

입니다.

+0

당신은 아이디 이메일에 하나의 요소 만이 확실한가요? –

답변

1

실제로 요소를 찾을 때 send_keys에 문제가 있습니다. 여기서는 요소의 보이지 않음으로 인해 이메일 입력에 값을 설정할 수 없습니다. 그러나 제공된 HTML에서 볼 수 있듯이 전자 메일 입력 요소에는 스타일 속성 속성이 없으므로 보이지 않게 될 수 있습니다.

username = browser.find_element_by_css_selector('div.input-group input#Email.form-control.email') 
username.send_keys("email") 

또는 ID가 모든 요소를 ​​찾으려고 -을 :

이 같은 ID를 가진 요소가 더 있고 다른 요소와 상호 작용 할 수있다, 당신은 다음과 같이 몇 가지 다른 로케이터로 시도해야 눈에 보이는 요소 Email 및 수행 send_keys() 다음과 같이

usernames = browser.find_elements_by_id('Email') 

for username in usernames: 
    if username.is_displayed(): 
     username.send_keys("email") 
     break 
+0

"Email"이라는 ID를 가진 두 번째 요소가있었습니다. CSS 선택기를 사용하여 해결할 수는 없지만 루핑이 작동했습니다. 고맙습니다!! – gtownrower

+0

@gtownrower 루핑하지 않고도 고유 로케이터를 제공하려고한다면이 동작이 효과적 일 것입니다.이'xpath'는 고유 할 수도 있습니다 .// label [text() = '전자 메일 주소']/following :: input [@id = '이메일']'또는'(.//input[id = '이메일')) [2]'.. –

관련 문제