我发现,处理这些JS最简单的方法postbacks
,就是等待受影响的元素 去 陈旧 或无法找到。
def waitForElementRemoved(Element, WaitCount, WaitTime):
ElementRemoved = False
WaitTry = 0
while not ElementRemoved:
try:
if WaitTry > WaitCount:
raise Exception("Element not removed from page in alloted time")
Test = Element.text
WaitTry += 1
time.sleep(WaitTime)
except (NoSuchElementException, StaleElementReferenceException):
ElementRemoved = True
然后,我将选择一个受此影响的元素,postback load
并将其与一些计时参数一起传递给函数。
如:
driver = webdriver.Firefox()
driver.get("https://www.avis.co.in")
removedElement = driver.find_element_by_id("DrpCity")
mySelect = Select(driver.find_element_by_id("DrpCity"))
mySelect.select_by_visible_text("Pune")
waitForElementRemoved(removedElement, 10, .5)
webdriverwait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='txtPickUp']"))).send_keys("XYZ")
我不知道这是否是处理JavaScript 事件的 方法onchange load
,但就我而言,它非常有效。
:我发现在有多个加载事件时, 并不总是有效,我发现使用该方法以及下面的代码可以更有效地确保这些动态加载事件已完成:(我改编了 HERE的以下代码)
# Wait for AJAX (Jquery or JS) dynamic page load events
class DynamicLoadState:
def __call__(self, driver):
LoadComplete = False
JQueryLoadComplete = False
JSLoadComplete = False
try:
if driver.execute_script("return jQuery.active") == 0: JQueryLoadComplete = True
except Exception:
# JQuery is not present on page
JQueryLoadComplete = True
if driver.execute_script("return document.readyState") == 'complete': JSLoadComplete = True
if JQueryLoadComplete and JSLoadComplete: LoadComplete = True
return LoadComplete
def WaitForDynamicLoad(driver, WaitTime):
webdriverwait(driver, WaitTime).until(DynamicLoadState())
# Use the first method of waiting for the element to go stale
# then run this to make sure all loading is completed
WaitForDynamicLoad(driver, Counts.WaitTime)
希望这有助于防止time.sleep()
将来有人使用页面加载!