0

Selenium 및 Chrome 드라이버를 사용하고 있지만 ID로 요소를 찾을 수 없습니다. 그러나이 요소는 브라우저의 웹 속성에서 볼 수 있습니다. 요소가 동적으로 생성 되었기 때문에 (브라우저 URL 막대에 동일한 URL이 항상 표시되지만 내용이 동적으로 변경되기 때문에) 생각합니다.Selenium을 사용하여 동적으로 생성 된 중첩 요소 찾기

해결 방법은 드라이버 대기를 적절하게 언변하는 것입니다. 첫 번째 페이지는 다음과 같습니다. 나는 성공적으로 과거를 얻을 수 있습니다 로그인 페이지 :

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
delay = 5 

username = driver.find_element_by_name('Username') 
password = driver.find_element_by_name('Password') 
username.send_keys('my_username') 
password.send_keys('my_password') 
login = driver.find_element_by_id('login_button') 
login.click() 

을 나는 성공적으로 내가이 클릭 한 후, button_a라고 불리는 요소를 찾을 수있는이 단계 후에는 페이지가 새로운 버튼이 말하는 생성 button_b,하는 대기 명령을 기다리는 중입니다.

button_a = driver.find_element_by_id('button_a') 
button_a.click() 
WebDriverWait(driver, delay).until(
    EC.presence_of_element_located(
     driver.find_element_by_id('button_b'))) 
드라이버가 오래된 DOM에 대한 참조를 유지하고 DOM에 추가 된 새로운 요소를 추적하지 않는 것 같다
selenium.common.exceptions.NoSuchElementException: Message: no such element:  Unable to locate element: {"method":"id","selector":"button_b"} 

, 페이지를 클릭 한 후 다시로드되지 않습니다 414,그러나 이것은 고전적인 예외를 throw button_a에 있지만 클라이언트가 동적으로 새 콘텐츠를 생성하는 클래식 스핀 휠을 얻었습니다. 이 시점에서 브라우저에서 마우스 오른쪽 버튼을 클릭 한 다음 button_b id가 존재하는지 명확하게 볼 수 있습니다.

셀렌으로 해결할 수 있습니까?

실례합니다. 웹 브라우저 자동화에서 방금 전적으로 멍청한 사람입니다.

답변

0

사실 당신은 잘못 가고 있습니다. 그러면 요소를 찾고 WebElement를 기다립니다. 아래로 대신 로케이터으로 사용하려고한다 : -

button_a = driver.find_element_by_id('button_a') 
button_a.click() 
button_b = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID, 'button_b'))) 
0

페이지 드라이버가 DOM에 추가 된 새로운 요소를 추적하지 않는 기존의 DOM과 에 대한 참조를 유지하는 것 같다 button_a를 클릭 한 후 이 다시로드되지 않지만 방금 클래식 스핀을 얻습니다. 클라이언트가 동적으로 새 콘텐츠를 생성하는 휠. 사실 셀레늄 등 페이지를 다시로드, AJAX 호출, 자바 스크립트 실행에 의해 만들어진 DOM에 대한 변경 사항을 감지 그래서, 당신의 당신의 button_a 말을 다음과 같은 시도 할 경우이 테스트에 넣어 :

buttonA = driver.find_element_by_id("button_a") 
//Ajax call here 
buttonA.click() 

StaleElementReferenceException 오류 (요소가 더 이상 DOM에 연결되지 않음)는 해당 요소에 대한 Selenium의 바인딩이 손실된다는 의미입니다. 나는 pythonist 아니에요으로

참고로
//get the first element, button_a and click it 
//going by your example this means you have only one element containing `button` 
//in the `id` 
driver.find_element_by_xpath(".//*[contains(@id,'button')]").click() 
//now, as you say, you will have 2 elements containing `button` in the `id` 
//so get all the elements and click on the last one 
buttonB = driver.find_elements_by_xpath(".//*[contains(@id,'button')]") 
buttonB[len(buttonB)-1].click() 

, 나는, 구문 오류가있는 경우에 대해 사과 : 이제

, 당신이 당신의 예를 사용하여,이 문제를 극복하기 위해, 당신은 함께 갈 수 .

관련 문제