当前位置: 首页 > 面试题库 >

Selenium Python UnboundLocalError:赋值之前引用了局部变量“ element”

孙阳旭
2023-03-14
问题内容

我正在尝试使用XPATH定位器单击包含文本“ Clean feed crm”的span标签。我得到错误:

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是:

process_lists_clean_feed_task_crm = "Clean feed crm"

我也尝试过使用WebDriverWait仍然相同的错误:

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]')))

我正在查找此文本时,%s,%feed的值为“ Clean feed crm”(作为参数传递到我的方法中。

我究竟做错了什么?然后,我可以使用什么XPATH单击具有“ Clean feed crm”文本的元素?

谢谢,里亚兹


问题答案:

如果我们回想起XPath语法中的一些元素:

  • 表达式“ //”从当前节点中选择匹配选择的节点,无论它们在何处。
  • 表达式“ ..”选择当前节点的父节点。

因此,当您编写:

//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节点,然后在内部查找包含文本的span标签。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 从父函数分配给变量:“分配前引用的局部变量” [重复] (5个答案) Python 3:UnboundLocalError:分配前被引用的局部变量[重复] (5个答案) 10个月前关闭。 我收到以下错误: UnboundLocalError:分配前已引用局部变量“ test1”。 错误说那是局部变量,但我认为这个变量是全局变量 那么它是全局的还是局部的,

  • 我一筹莫展,我不知道是什么引起了这个问题。我所做的唯一更改是将loginquiredmixins添加到基于类的视图中。 当我开始设计登录页面时,我似乎弄坏了一些东西,但我不知道具体是什么,这是一个奇怪的想法,CSS或某些HTML会导致什么问题,对吗? 我尝试在语句之前赋值变量,并将其设置为,但这似乎不能正常工作,因为它会抛出错误。我使用的是基本的django认证系统。 我得到的确切错误是- “ 这

  • 我在找两个数的lcm。但是当我运行这个程序时,我得到了一个错误:UnboundLocalError:在赋值之前引用了本地变量'lcm',为什么我会得到这个错误呢?我不明白我的代码出了什么问题。请帮帮我 这是我的代码:

  • 问题内容: 我想知道你们是否可以提供帮助。我试图做一个简单的视图,它将用户发送到客户端创建表单,但是我一直收到此错误: 赋值之前引用的局部变量“ form” 查看我的代码,看不到有什么问题。 有人告诉我我哪里出问题了吗? 问题答案: 这是正在发生的事情: 没有输入该块。 变量未定义。 然后,你尝试在语句中引用变量。 至于解决方法,这确实是你要决定的。解决的方法取决于你希望代码执行的操作(如果请求方

  • 本文向大家介绍详解PHP变量传值赋值和引用赋值变量销毁,包括了详解PHP变量传值赋值和引用赋值变量销毁的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PHP变量传值赋值和引用赋值变量销毁的具体代码,供大家参考,具体内容如下 php中,上面的代码,变量是怎么存放的呢? 上面的代码变动下,将变量b赋值给变量a,会发生什么? 问题来了,$a = $b,那么是将变量a的指针指向了变量b指针所

  • 我有以下一段代码在我的程序,我正在运行SonarQube 5的代码质量检查后,它与Maven集成。 然而,Sonar要求删除这个对局部变量“session”的无用赋值。