복붙노트

[PYTHON] 셀레늄 요소 보이지 않는 예외

PYTHON

셀레늄 요소 보이지 않는 예외

웹 사이트의 버튼을 클릭하기위한 파서를 작성해야하며 버튼 중 하나만 클릭하는 데 문제가 있습니다. 다음 코드는 하나를 제외한 모든 버튼에서 작동합니다.

다음은 html입니다. http://pastebin.com/6dLF5ru8

여기에 소스 HTML이 있습니다. http://pastebin.com/XhsedGLb

파이썬 코드 :

 driver = webdriver.Firefox()  
 ...
 el = driver.find_element_by_id("-spel-nba")
 actions.move_to_element(el)
 actions.sleep(.1)
 actions.click()
 actions.perform()

이 오류가 발생합니다.

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with

Saifur 당 나는 방금 예외를 볼 수있는 동일한 요소로 기다렸다가 시도 :

wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.XPATH, "//input[contains(@id,'spsel')][@value='nba']"))).click()

해결법

  1. ==============================

    1.페이지 소스를 살펴보면 거의 모든 SECTECT 요소가 JavaScript로 위조되어 생성된다는 사실을 알게 될 것입니다. 이것이 webdriver에서 볼 수없는 이유입니다.

    페이지 소스를 살펴보면 거의 모든 SECTECT 요소가 JavaScript로 위조되어 생성된다는 사실을 알게 될 것입니다. 이것이 webdriver에서 볼 수없는 이유입니다.

    해결 방법이 있지만, ActionChains를 사용하여 개발자 콘솔을 열고 원하는 요소에 인공 CLICK를 삽입합니다. 사실 NBA 데이터로드를 트리거하는 Label입니다. 여기서는 작동하는 예제가 있습니다.

    from selenium import webdriver
    from selenium.webdriver.common import action_chains, keys
    import time
    
    driver = webdriver.Firefox()
    driver.get('Your URL here...')
    assert 'NBA' in driver.page_source
    action = action_chains.ActionChains(driver)
    
    # open up the developer console, mine on MAC, yours may be diff key combo
    action.send_keys(keys.Keys.COMMAND+keys.Keys.ALT+'i')
    action.perform()
    time.sleep(3)
    # this below ENTER is to rid of the above "i"
    action.send_keys(keys.Keys.ENTER)
    # inject the JavaScript...
    action.send_keys("document.querySelectorAll('label.boxed')[1].click()"+keys.Keys.ENTER)
    action.perform()
    

    또는 모든 ActionChains 명령을 바꾸려면 다음과 같이 execute_script를 실행하면됩니다.

    driver.execute_script("document.querySelectorAll('label.boxed')[1].click()")
    

    저기, 적어도 내 로컬 파일에 어쨌든 ... 희망이 도움이!

  2. ==============================

    2.나에게 도움이 된 것은 문제가있는 요소 바로 앞에있는 요소 (즉, 탭 순서의 직전)를 찾은 다음 해당 요소에서 Tab을 호출하는 것이 었습니다.

    나에게 도움이 된 것은 문제가있는 요소 바로 앞에있는 요소 (즉, 탭 순서의 직전)를 찾은 다음 해당 요소에서 Tab을 호출하는 것이 었습니다.

    from selenium.webdriver.common.keys import Keys
    elem = br.find_element_by_name("username")
    elem.send_keys(Keys.TAB) # tab over to not-visible element
    

    그렇게 한 후에, 나는 엘리먼트에 액션을 보낼 수 있었다.

  3. ==============================

    3.xpath에 명시 적 대기를 사용하는 것이 좋습니다.

    xpath에 명시 적 대기를 사용하는 것이 좋습니다.

    //input[contains(@id,'spsel')][@value='nba']
    
  4. ==============================

    4.'요소가 현재 표시되지 않는 경우'인 경우 표시합니다.

    '요소가 현재 표시되지 않는 경우'인 경우 표시합니다.

    f.e.

    >>> before is hidden top is outside of page
    <input type="file" style="position: absolute;top:-999999" name="file_u">
    
    
    >>> after move top on in page area
    DRIVER.execute_script("document.getElementByName('file_u').style.top = 0;")
    time.sleep(1); # give some time to render
    DRIVER.find_element_by_name("file_u").send_keys("/tmp/img.png")
    
  5. ==============================

    5.이 스레드의 실제 솔루션은 나를 위해 작동하지 않았다.

    이 스레드의 실제 솔루션은 나를 위해 작동하지 않았다.

    하나,

    이 하나 않았다 :

    element  = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, xpaths['your_xpath_path'])))
    

    트릭은 다음을 사용하는 것입니다.

    WebDriverWait

    이 가져 오기에서 가져온 것 :

  6. ==============================

    6.get_element_by_id () 대신 elem = browser.find_element_by_css_selector ( '# elemId') (해당 웹 페이지와 요소로 이동하여 오른쪽 클릭하고 CSS Selector 복사 등)를 시도해보십시오. 이것이 내가 한 일이며 작동합니다 . find_element_by_link_text (text), find_element_by_partial_link_text (text), find_element_by_tag_name (tagName_case_insensitive_here), find_element_by_name (name) 등을 시도해보십시오. 이드 다음으로 CSS Selector가 최선의 방법입니다.

    get_element_by_id () 대신 elem = browser.find_element_by_css_selector ( '# elemId') (해당 웹 페이지와 요소로 이동하여 오른쪽 클릭하고 CSS Selector 복사 등)를 시도해보십시오. 이것이 내가 한 일이며 작동합니다 . find_element_by_link_text (text), find_element_by_partial_link_text (text), find_element_by_tag_name (tagName_case_insensitive_here), find_element_by_name (name) 등을 시도해보십시오. 이드 다음으로 CSS Selector가 최선의 방법입니다.

  7. from https://stackoverflow.com/questions/27927964/selenium-element-not-visible-exception by cc-by-sa and MIT license