2015-10-25 73 views
0

我想單擊一個使用XPATH定位器的文本「Clean feed crm」 的span標籤。 我得到的錯誤:Selenium Python UnboundLocalError:分配前引用的局部變量「元素」

UnboundLocalError: local variable 'element' referenced before assignment 

完整的錯誤跟蹤:

Traceback (most recent call last): 
    File "C:\Webdriver\ClearCore\TestCases\OperationsPage_TestCase.py", line 56, in test_add_and_run_clean_process 
    process_lists_page.click_clean_feed_task_from_groups_tab(Globals.process_lists_clean_feed_task_crm) 
    File "C:\Webdriver\ClearCore\Pages\operations.py", line 90, in click_clean_feed_task_from_groups_tab 
    clean_feed_crm_element = self.get_element(By.XPATH, '//div[@id="operations_add_process_list_ct_groups_and_tasks"]//../span[contains(text(), "Clean feed crm")]') 
    File "C:\Webdriver\ClearCore 501\Pages\base.py", line 31, in get_element 
    return element 
UnboundLocalError: local variable 'element' referenced before assignment 

如果我用的是絕對完整的XPath它工作正常。相對的XPATH顯示錯誤。

其運作完整的絕對XPath是:

(By.XPATH, 'html/body/div[2]/div[2]/div/div[4]/div/div[2]/div/div[3]/div/div[7]/div/div[3]/div/div[4]/div/div[2]/div/div[4]/div/div[3]/div/div[3]/div/div[2]/div/div[1]/div/div/div/div/div[1]/div[1]/div[2]/div/div[1]/div[1]/div/div/div[2]/div/div[2]/span[1]/span') 

不工作相對XPATH是:

(By.XPATH, '//div[@id="operations_add_process_list_ct_groups_and_tasks"]//../span[contains(text(), "Clean feed crm")]') 

的HTML是:

<div id="operations_add_process_list_ct_groups_and_tasks" class="GPI5XK1CDG" __gwtcellbasedwidgetimpldispatchingfocus="true" __gwtcellbasedwidgetimpldispatchingblur="true" role="tree"> 
    <div style="overflow: hidden;"> 
    <div> 
    <div> 
    <div aria-selected="false" role="treeitem" aria-setsize="3" aria-posinset="1" aria-expanded="true" aria-level="1"> 
    <div class="GPI5XK1CIF GPI5XK1CAG" style="padding-left: 0px;"> 
    <div style="overflow: hidden;"> 
    <div> 
    <div> 
    <div aria-selected="false" role="treeitem" aria-setsize="3" aria-posinset="1" aria-level="2"> 
    <div class="GPI5XK1CIF" style="padding-left: 16px;"> 
    <div class="GPI5XK1CIF GPI5XK1CKF" style="padding-left: 16px;position:relative;" onclick=""> 
    <div style="position:absolute;display:none;"/> 
    <div class="GPI5XK1CLF"> 
    <div style="padding-left: 22px;position:relative;zoom:1;"> 
    <div style="left:0px;margin-top:-8px;position:absolute;top:50%;line-height:0px;"> 
    <img border="0" style="width:16px;height:16px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC2UlEQVR42mNgQANlZ1PqG84XfA7YYVsG5AqBaK+lFnM0E5RUgXx2IGZkwAbq99ezgCTTj4Wu//jrw/+68/mf3BeZ7ei5XPdv6+M1/y2btBcC5TWghqCCwlPxzZ2Xqz/FHfbe3Xu57uudTzf+H3i+4//eZ1v/H3257//aB4v/a8XKrxE1Esw2LFDzBGrhAGImuAFdl2s+/fjz/f+r7y/+H3qxG6zx0ruz/8++Of5/x5P1/7c8Xv2/9lzu/7Izqf/9N9t8E9bidwZq44d5h9Fvo9XMlffn/z/x6iBY040Pl/8vuTvj/7bH68BiMENAdOnplP/SdqJTgfr0wd7xXmnu6DTTcOmcWxP+73m25f+tj9f+B+6w/afoJb5TNVRmHVDDl11PN/0HhQPQm//NazQ/sQuzgwxwB2IehsiDLr9AzgXZClJ49f0FYIDpXAVKLgHiCu81lis3PloBNgAYoP8NclVuc0lwTgbKOQAxN0PIPvuXR17u+X/wxS6wE0++PgyKgT9mNRpL/TZat0253v5m3cMl/0GGgLy56v6C/4YFqg+Bmr3B4WDdot3usdjsg+96K7AhIFeAYgCkCaQBRIP8D2JXns0AG6CdqHAXqLkYiGVBgSjMq8CdELjd9jvIAFDAgTDIyTA2SBPI/0CNT2UcRHfwynLNRTaAxahQrQ8U1yvuzQX7E2TrmgeLwDHRdKH4/9K7s/5Pu9H1X85VfC9Q/UwgzgVie2hUMjDopSs5A13wy3GywX+TMvXHwFj4DfJz4mG//1bNOv8yjoX+m3trIsjvT4HKa6FRyAfEzLC0xCnvKp4ibiI4CcieoREpe7DjUuV/0wqNn8yczEsF1XkXgdiiBoKrgPLlQCyHnidAHBEgtgRiJzlXiUagS35J24psAfJBhkYwczAnQjUHgsINW34CpW1OcOKAGOYBypxAHAXE8kAsBsSKUDkWBgIApEAISSMr1JWM6E4HAJKeit5kyDtvAAAAAElFTkSuQmCC) no-repeat 0px 0px;" src="http://justin-pc.infoshare.local:8080/clearcore501/ClearCore/clear.cache.gif" onload="this.__gwtLastUnhandledEvent="load";"/> 
    </div> 
    <div> 
     <span> 
      <span class=" myinlineblock" title="Clean feed crm" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;empty-cells:show;width:100%;margin-right:-14px;">Clean feed crm</span> 
     </span> 
     <span> 
      <span class="" title="Turn task off or on." style=""> 
      <input type="checkbox" checked="" tabindex="-1"/> 
     </span> 
    </span> 
    </div> 
    </div> 
    </div> 
    </div> 
    </div> 
    </div> 
    <div aria-selected="false" role="treeitem" aria-setsize="3" aria-posinset="2" aria-level="2"> 
    <div class="GPI5XK1CIF" style="padding-left: 16px;"> 
    <div class="GPI5XK1CIF GPI5XK1CKF" style="padding-left: 16px;position:relative;" onclick=""> 
    <div style="position:absolute;display:none;"/> 
    <div class="GPI5XK1CLF"> 
    <div style="padding-left: 22px;position:relative;zoom:1;"> 
     <div style="left:0px;margin-top:-8px;position:absolute;top:50%;line-height:0px;"> 
      <img border="0" style="width:16px;height:16px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC2UlEQVR42mNgQANlZ1PqG84XfA7YYVsG5AqBaK+lFnM0E5RUgXx2IGZkwAbq99ezgCTTj4Wu//jrw/+68/mf3BeZ7ei5XPdv6+M1/y2btBcC5TWghqCCwlPxzZ2Xqz/FHfbe3Xu57uudTzf+H3i+4//eZ1v/H3257//aB4v/a8XKrxE1Esw2LFDzBGrhAGImuAFdl2s+/fjz/f+r7y/+H3qxG6zx0ruz/8++Of5/x5P1/7c8Xv2/9lzu/7Izqf/9N9t8E9bidwZq44d5h9Fvo9XMlffn/z/x6iBY040Pl/8vuTvj/7bH68BiMENAdOnplP/SdqJTgfr0wd7xXmnu6DTTcOmcWxP+73m25f+tj9f+B+6w/afoJb5TNVRmHVDDl11PN/0HhQPQm//NazQ/sQuzgwxwB2IehsiDLr9AzgXZClJ49f0FYIDpXAVKLgHiCu81lis3PloBNgAYoP8NclVuc0lwTgbKOQAxN0PIPvuXR17u+X/wxS6wE0++PgyKgT9mNRpL/TZat0253v5m3cMl/0GGgLy56v6C/4YFqg+Bmr3B4WDdot3usdjsg+96K7AhIFeAYgCkCaQBRIP8D2JXns0AG6CdqHAXqLkYiGVBgSjMq8CdELjd9jvIAFDAgTDIyTA2SBPI/0CNT2UcRHfwynLNRTaAxahQrQ8U1yvuzQX7E2TrmgeLwDHRdKH4/9K7s/5Pu9H1X85VfC9Q/UwgzgVie2hUMjDopSs5A13wy3GywX+TMvXHwFj4DfJz4mG//1bNOv8yjoX+m3trIsjvT4HKa6FRyAfEzLC0xCnvKp4ibiI4CcieoREpe7DjUuV/0wqNn8yczEsF1XkXgdiiBoKrgPLlQCyHnidAHBEgtgRiJzlXiUagS35J24psAfJBhkYwczAnQjUHgsINW34CpW1OcOKAGOYBypxAHAXE8kAsBsSKUDkWBgIApEAISSMr1JWM6E4HAJKeit5kyDtvAAAAAElFTkSuQmCC) no-repeat 0px 0px;" src="http://justin-pc.infoshare.local:8080/clearcore501/ClearCore/clear.cache.gif" onload="this.__gwtLastUnhandledEvent="load";"/> 
     </div> 
    <div> 
     <span> 
      <span class=" myinlineblock" title="Clean feed escr" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;empty-cells:show;width:100%;margin-right:-14px;">Clean feed escr</span> 
     </span> 
     <span> 
     <span class="" title="Turn task off or on." style=""> 
      <input type="checkbox" checked="" tabindex="-1"/> 
     </span> 
    </span> 
    </div> 
    </div> 
    </div> 
    </div> 
    </div> 
    </div> 

我的方法實現:

def click_clean_feed_task_from_groups_tab(self, feed): 
     # Params: feed: clean feed crm, clean feed escr or clean feed orchard 
     #clean_feed_crm_element = self.driver.find_element(By.XPATH, '//span[@class="myinlineblock" and contains(text(), "%s") % feed]')    
     clean_feed_crm_element = self.get_element(By.XPATH, '//div[@id="operations_add_process_list_ct_groups_and_tasks"]//../span[contains(text(), "Clean feed crm")]') 
     #clean_feed_crm_element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//div[@id="operations_add_process_list_ct_groups_and_tasks"]//..//.//..//..//..//..//..//..//../span[contains(text(), "%s")] % feed ]')))  
     clean_feed_crm_element.click() 
     return self 

從我的TestCase類我叫個方法:

project_navigator = ProjectNavigatorPage(self.driver) 
    process_lists_page = project_navigator.select_projectNavigator_item("Process Lists") 
    process_lists_page.click_add_button_for_process_lists() 
    process_lists_page.click_clean_task_arrow_to_expand_it_from_groups_tab("add") 
    process_lists_page.click_clean_feed_task_from_groups_tab(Globals.process_lists_clean_feed_task_crm) 

Globals.py是:

clean_feed_crm_element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable(((By.XPATH, '//div[@id="operations_add_process_list_ct_groups_and_tasks"]//../span[contains(text(), "%s") % feed]')))  

process_lists_clean_feed_task_crm = "Clean feed crm" 

我havea也使用WebDriverWait還是同樣的錯誤嘗試

%s,%feed的值是「Clean feed crm」,因爲我正在查找此文本(作爲參數傳入我的方法中。

我在做什麼錯了?我可以使用什麼XPATH來點擊具有文本「Clean feed crm」的元素?

謝謝, 里亞茲

回答

1

如果我們回憶起中的XPath sintax一些元件:

  • 表述「//」從不管符合選擇當前 節點選擇文檔中的節點他們在哪裏。
  • 表達式「..」選擇當前節點的父節點。

因此,當你寫:

//div[@id="operations_add_process_list_ct_groups_and_tasks"]//.. 

您選擇的div節點本身。從該節點相關的XPath應該是:

//div[@id="operations_add_process_list_ct_groups_and_tasks"]//span[contains(text(), "Clean feed crm")] 

您選擇與所選的ID的DIV節點,看看裏面的包含文本的跨度標籤的方式。

+0

這工作,我明白什麼是/和..現在做。謝謝。 –

相關問題