[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.페이지 소스를 살펴보면 거의 모든 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.나에게 도움이 된 것은 문제가있는 요소 바로 앞에있는 요소 (즉, 탭 순서의 직전)를 찾은 다음 해당 요소에서 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.xpath에 명시 적 대기를 사용하는 것이 좋습니다.
xpath에 명시 적 대기를 사용하는 것이 좋습니다.
//input[contains(@id,'spsel')][@value='nba']
-
==============================
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.이 스레드의 실제 솔루션은 나를 위해 작동하지 않았다.
이 스레드의 실제 솔루션은 나를 위해 작동하지 않았다.
하나,
이 하나 않았다 :
element = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, xpaths['your_xpath_path'])))
트릭은 다음을 사용하는 것입니다.
WebDriverWait
이 가져 오기에서 가져온 것 :
-
==============================
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가 최선의 방법입니다.
from https://stackoverflow.com/questions/27927964/selenium-element-not-visible-exception by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 목록에서 최대 값의 모든 위치를 찾는 방법? (0) | 2018.10.07 |
---|---|
[PYTHON] 예외 (테스트 만)가 아닌 것처럼 numpy 경고를 어떻게 catch합니까? (0) | 2018.10.07 |
[PYTHON] Python : Base64 디코딩시 '잘못된 패딩'오류 무시 (0) | 2018.10.07 |
[PYTHON] Flask 요청의 다른 부분을 어떻게 얻습니까? (0) | 2018.10.07 |
[PYTHON] matplotlib의 날짜 틱 및 회전 (0) | 2018.10.07 |