如何等待通过Selenium和WebDriver进行的JavaScript\uuu doPostBack调用

如何等待通过Selenium和WebDriver进行的JavaScript\uuu doPostBack调用,javascript,python,selenium,asp.net-ajax,dopostback,Javascript,Python,Selenium,Asp.net Ajax,Dopostback,在尝试填写网站上的两个字段时,通过Selenium/Python实现自动化时,我遇到了一个罕见的问题。我的脚本填充了第一个字段,即“来源城市”非常好。我已将WebDriverWait导入第二个字段传递地址 我猜送货地址字段几乎可以在服务员被诱导之前点击 但是origincity字段有一个通过onchange事件关联的JavaScript,如下所示: onchange="javascript:setTimeout('__doPostBack(\'DrpCity\',\'\')', 0)" dri

在尝试填写网站上的两个字段时,通过Selenium/Python实现自动化时,我遇到了一个罕见的问题。我的脚本填充了第一个字段,即“来源城市”非常好。我已将WebDriverWait导入第二个字段传递地址

我猜送货地址字段几乎可以在服务员被诱导之前点击

但是origincity字段有一个通过
onchange
事件关联的JavaScript,如下所示:

onchange="javascript:setTimeout('__doPostBack(\'DrpCity\',\'\')', 0)"
driver.get("https://www.avis.co.in")
mySelect = Select(driver.find_element_by_id("DrpCity"))
mySelect.select_by_visible_text("Pune")
WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element_by_xpath("//input[@id='txtPickUp']")))
driver.find_element_by_xpath("//input[@id='txtPickUp']").send_keys("XYZ")
原产地城市HTML:

  • 起源城市 班加罗尔 钦奈 新德里 海得拉巴 高知 加尔各答 孟买 浦那 选择你的城市!
  • 我发现,处理这些JS
    回发的最简单方法是等待受加载影响的元素过时或找不到

    下面是一个示例函数:

    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
    
    然后,我将选择一个受此
    回发加载影响的元素,并将其与一些计时参数一起传递给函数

    例如:

    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
    事件的最佳方法,但在我看来,它非常有效


    补充这个答案:我发现当存在多个加载事件时,等待元素过时并不总是有效,我发现使用该方法以及使用以下代码可以更有效地确保这些动态加载事件的完成:(我将以下代码改编自)


    希望这有助于防止有人使用
    time.sleep()
    页面加载的未来!

    @PixelEinstein的答案是可行且被接受的答案,因为他的想法是等待受加载影响的元素过时或找不到。最后,我通过一种比预期简单得多的方法找到了解决方案。我只需等待DELIVER ADDRESS字段to转到stale,然后在DELIVER ADDRESS字段上再次调用“send_keys(“XYZ”)”,如下所示:

    onchange="javascript:setTimeout('__doPostBack(\'DrpCity\',\'\')', 0)"
    
    driver.get("https://www.avis.co.in")
    mySelect = Select(driver.find_element_by_id("DrpCity"))
    mySelect.select_by_visible_text("Pune")
    WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element_by_xpath("//input[@id='txtPickUp']")))
    driver.find_element_by_xpath("//input[@id='txtPickUp']").send_keys("XYZ")
    
    讨论有助于理解
    \uu doPostBack()

    太长,读不下去了

    非常感谢。您的评论是等待受负载影响的元素过时或找不到。很好,很高兴我能提供帮助!