bestsource

웹 드라이버가 파이썬에서 에이잭스 요청을 기다립니다.

bestsource 2023. 8. 2. 09:17
반응형

웹 드라이버가 파이썬에서 에이잭스 요청을 기다립니다.

현재 저는 제안을 위해 에이잭스를 사용하는 검색을 위한 웹드라이버 테스트를 작성하고 있습니다.검색 내용을 입력한 후 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

반응형