2016-11-23 58 views
0

自動化一些測試時,我遇到了一些問題 - 主要是WebDriverException,點擊將被另一個對象捕獲。我可以通過使用webdriverwait爲元素消失來解決問題 - 這是一種以模式顯示的滑動成功消息,但異常消息讓我思考;而不是使用明確的等待,是否有可能捕獲異常,解析文本並提取對象的一些可識別信息,然後將其用於該方法的webdriverwait?是否有可能從webdriver異常文本中獲取定位符?

因此,舉例來說,如果我這樣做:

self.wait_for_success_modal_to_disappear(context) 
self.element_is_clickable(context, mark_as_shipped).click() 

它會工作,但如果我註釋掉wait方法,它會失敗,錯誤消息:

WebDriverException: Message: unknown error: Element is not clickable at 
point (x, y). Other element would receive the click: <div class="success-modal">...</div> 

我在想的是修改element_is_clickable方法,在異常處理方法中包含基於異常文本的可重用方法,有點像這樣:

def element_is_clickable(self, context, locator): 
    try: 
     WebDriverWait(context.driver, 15).until(
        EC.visibility_of_element_located(locator) 
       ) 
     WebDriverWait(context.driver, 15).until(
        EC.element_to_be_clickable(locator) 
       ) 
     return context.driver.find_element(*locator) 
    except WebDriverException: 
     error_message = repr(traceback.print_exc()) 
     modal_class_name = <<method to grab everything between the quotation marks>> 
     WebDriverWait(context.driver, 15).until(
      EC.invisibility_of_element_located((By.CLASS_NAME, modal_class_name)) 
     ) 
     WebDriverWait(context.driver, 15).until(
       EC.visibility_of_element_located(locator) 
      ) 
     WebDriverWait(context.driver, 15).until(
       EC.element_to_be_clickable(locator) 
      ) 
     return context.driver.find_element(*locator) 

現在,我知道這不是正確的方式來處理這個,因爲錯誤是在click()而不是在識別元素,但我最感興趣的是捕獲和解析異常消息的可能性,並使用該數據以一種有用的方式。這是可能嗎?

回答

0

您可以等到對象,也可以捕捉點擊,消失與條件until_not

import re 

try: 
    # click already defined element, e.g. button 
    element.click() 
except WebDriverException as e: 
    # in case of captured click parse exception for this div locator 
    xpath = '//div[@%s]' % re.search('class="\w+"', e.args[0]).group() # this is just a simple example of how to handle e.args[0] (exception message string) with regular expressions- you can handle it as you want to 
    # wait until modal disappear 
    WebDriverWait(driver, 15).until_not(EC.visibility_of_element_located((By.XPATH, xpath))) 
    # click again 
    element.click() 
相關問題