selenium
셀레늄 기다리기
수색…
소개
새로운 셀렌 사용자를위한 가장 일반적인 걸림돌 중 하나는 페이지가 완전히로드 될 때까지 기다리는 것입니다. 휴먼 사용자는 페이지가 완전히로드되었는지 또는로드 중인지 쉽게 알 수 있습니다. 그러나 Selenium은 정해진 시간 동안 기다립니다. 따라서 페이지의 요소를 기다리는 좋은 방법이있는 것이 편리합니다. loop와 sleep () 함수로 이것을 수행하는 것이 가능 하지만, 이미 Selenium에 내장 된 훨씬 더 깨끗한 방법이 있습니다.
파이썬에서 명시 적 대기
브라우저가 동적 페이지 (일반적으로 AJAX 기반 웹 응용 프로그램)로 이동하면 페이지의 요소가로드되는 데 다른 시간이 걸릴 수 있으며 일부 요소는 일부 사용자 동작에 대한 응답으로 만로드됩니다. 이러한 경우 요소의 직접 검색이 실패 할 수 있습니다.
# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q')
가장 확실한 해결책은 요소를 검색하기 전에 대기를 도입하는 것입니다.
# Don't do this: inefficient solution for ElementNotVisibleException
time.sleep(5) # delays for 5 seconds
element = driver.find_element_by_name('q')
그러나 이러한 솔루션은 비효율적입니다. 대부분의 경우 요소가 1 초 후에 나타나고 (때로는 최대 5 초까지 소요되는 경우도 있음) 테스트가 항상 5 초 동안 대기하기 때문입니다. 한 곳이라도별로 보이지 않지만 대개 각 테스트는 여러 요소를 처리하며 여러 테스트가 있으며 전체 테스트 기간이 합산됩니다.
더 나은 해결책은 엘리먼트가 최대 5 초 동안 나타나기를 기다리는 것이지만, 엘리먼트가 발견되는 즉시 기다림에서 되돌아 오는 것입니다. WebDriverWait
사용하면 그렇게 할 수 있습니다.
다음 예는 www.google.com으로 이동하여 검색 창이로드 될 때까지 기다린 후 최대 5 초 동안 '셀렌'을 검색합니다.
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# Create a new chromedriver instance
driver = webdriver.Chrome()
# Go to www.google.com
driver.get("https://www.google.com")
try:
# Wait as long as required, or maximum of 5 sec for element to appear
# If successful, retrieves the element
element = WebDriverWait(driver,5).until(
EC.presence_of_element_located((By.NAME, "q")))
# Type "selenium"
element.send_keys("selenium")
#Type Enter
element.send_keys(Keys.ENTER)
except TimeoutException:
print("Failed to load search bar at www.google.com")
finally:
driver.quit()
셀레늄으로 자바 기다리기
명시 적 대기 : 코드에서 계속 진행하기 전에 특정 조건이 발생할 때 까지 기다 립니다 .
WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));
암시 적 대기 : 요소 나 요소를 즉시 사용할 수없는 경우 해당 요소를 찾으려고 할 때 일정한 시간 동안 기다 립니다 .
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));