웹 드라이버가 파이썬에서 에이잭스 요청을 기다립니다.
현재 저는 제안을 위해 에이잭스를 사용하는 검색을 위한 웹드라이버 테스트를 작성하고 있습니다.검색 내용을 입력한 후 Enter 키를 누르기 전에 명시적 대기를 추가하면 테스트가 잘 작동합니다.
wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys("obama")
time.sleep(2)
wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys(Keys.RETURN)
그렇지만
wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys("obama")
wd.find_element_by_xpath("//div[@class='searchbox']/input").send_keys(Keys.RETURN)
실패합니다. 가상 CPU가 1개인 ec2에서 테스트를 실행하고 있습니다.아마 검색과 관련된 GET 요청이 전송되기도 전에 Enter 키를 눌렀는데 제안하기 전에 Enter 키를 누르면 실패하는 것 같습니다.
명시적 대기를 추가하는 더 좋은 방법이 있습니까?
API 응답이 서버에서 반환되는지 확인하는 이 메서드를 추가합니다.
def wait_for_ajax(driver):
wait = WebDriverWait(driver, 15)
try:
wait.until(lambda driver: driver.execute_script('return jQuery.active') == 0)
wait.until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
except Exception as e:
pass
실제로 다음과 같은 요소의 존재에 대한 명시적 대기를 추가할 수 있습니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
ff.find_element_by_xpath("//div[@class='searchbox']/input").send_keys("obama")
try:
element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "keywordSuggestion")))
finally:
ff.find_element_by_xpath("//div[@class='searchbox']/input").send_keys(Keys.RETURN)
ff.quit()
참조: http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits
사용할 수 있습니다.selenium-wire
대신 포장지인selenium
웹 드라이버를 위해 클라이언트에 포트 8087로 프록시를 설정하고 모든 요청을 수신합니다.코드는 다음과 같습니다.
from seleniumwire import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=127.0.0.1:8087')
driver = webdriver.Remote(
command_executor="http://127.0.0.1:4444/wd/hub",
options=chrome_options,
seleniumwire_options={
'auto_config': False,
'port': 8087,
'addr': '127.0.0.1',
}
)
그리고 다음은 어떻습니까?
driver.implicitly_wait(10)
예를 들어,
wd.implicitly_wait(10)
이 경우 요소를 클릭하거나 찾을 때마다 드라이버가 10초 동안 0.5초마다 이 작업을 시도합니다.이 경우 매번 대기 시간을 추가할 필요가 없습니다.참고: 하지만 이것은 화면의 요소에 관한 것입니다.일부 JS 작업이 끝날 때까지 기다리지 않습니다.
언급URL : https://stackoverflow.com/questions/24053671/webdriver-wait-for-ajax-request-in-python
'bestsource' 카테고리의 다른 글
Powershell의 날짜 가져오기:변수에서 어제를 22시에 얻는 방법은? (0) | 2023.08.02 |
---|---|
트위터 부트스트랩에서 모달 클로징 이벤트를 처리하는 방법은? (0) | 2023.08.02 |
스프링 데이터에서 JPA 엔티티를 아름답게 업데이트하는 방법은 무엇입니까? (0) | 2023.08.02 |
Android View 모델 대 View 모델 (0) | 2023.08.02 |
PHP: 게시된 모든 데이터를 자동으로 가져올 수 있습니까? (0) | 2023.08.02 |