我发现,处理这些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 eventsclass 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 LoadCompletedef 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 completedWaitForDynamicLoad(driver, Counts.WaitTime)希望这有助于防止
time.sleep()将来有人使用页面加载!



