首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Selenium和Python中的XPATH问题

Selenium和Python中的XPATH问题
EN

Stack Overflow用户
提问于 2019-02-19 17:33:36
回答 1查看 157关注 0票数 0

我正在尝试自动化一些服务组件--现在。我正在做的大多数事情都是工作的,除了下面的例外。

从网站上获取下面的代码片段。

代码语言:javascript
复制
    <select aria-required="true" 
                    aria-labelledby="label.cmdb_ci_netgear.u_criticality"
                    ng-non-bindable="true" name="cmdb_ci_netgear.u_criticality" 
                    id="cmdb_ci_netgear.u_criticality" 
                    onchange="onChange('cmdb_ci_netgear.u_criticality');" style="; " 
                    class="form-control" mandatory="true" aria-readonly="false">
        <option value="" role="option">-- None --</option>
        <option value="Level_1" role="option">Level 1</option>
        <option value="Level_2" role="option">Level 2</option>
        <option value="Level_3" role="option">Level 3</option>
        <option value="Level_4" role="option">Level 4</option>
        <option value="Level_5" role="option">Level 5</option>
        <option value="Level_6" role="option">Level 6</option>
        <option value="0" role="option">0</option>
        <option value="Not_Agreed" role="option">Not Agreed</option>
        <option value="level 1" role="option">level 1</option>
        <option value="1" role="option">1</option>
        <option value="3843" role="option">3843</option>
    </select>

如果我检查超文本标记语言并复制Level_(1-6)选项的XPATH,我会得到下面的关系。

代码语言:javascript
复制
    code =      <option value="Level_1" role="option">Level 1</option>
    xpath =     //*[@id="cmdb_ci_netgear.u_criticality"]/option[2]      

    code =      <option value="Level_2" role="option">Level 2</option>
    xpath =     //*[@id="cmdb_ci_netgear.u_criticality"]/option[3]          

    code =      <option value="Level_3" role="option">Level 3</option>
    xpath =     //*[@id="cmdb_ci_netgear.u_criticality"]/option[4]          

    code =      <option value="Level_4" role="option">Level 4</option>
    xpath =     //*[@id="cmdb_ci_netgear.u_criticality"]/option[5]          

    code =      <option value="Level_5" role="option">Level 5</option>
    xpath =     //*[@id="cmdb_ci_netgear.u_criticality"]/option[6]          

    code =      <option value="Level_6" role="option">Level 6</option>
    xpath =     //*[@id="cmdb_ci_netgear.u_criticality"]/option[7]      

这是我运行的代码,用来匹配来自其他地方的存储值,以更新相应的XPath

代码语言:javascript
复制
def CI_Create(self,ci_id,Catols):
    self.CI_field_excludes = ['install_status','u_visible_to', 'discovery_source','device_type','u_environment']
    self.ci_ids = ci_id
    self.Catol = Catols
    self.browser.get("https://rttmstest.service-now.com/cmdb_ci_netgear.do")
    sleep(5)
    for i in self.Catol:
        sleep(5)
        print('processing '+ i)
        if i == 'u_criticality':
            print('criticality text is ' + self.Catol['u_criticality'][1])
            if self.Catol[i][1] == 'Level_1':
                print('xxx - process criticality as Level_1')
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.u_criticality"]/option[2]').click()
            elif self.Catol[i][1] == 'Level_2':
                print('xxx - process criticality as Level_2')
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.u_criticality"]/option[3]').click()
            elif self.Catol[i][1] == 'Level_3':
                print('xxx - process criticality as Level_3')
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.u_criticality"]/option[4]').click()
            elif self.Catol[i][1] == 'Level_4':
                print('xxx - process criticality as Level_4')
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.u_criticality"]/option[5]').click()
            elif self.Catol[i][1] == 'Level_5':
                print('xxx - process criticality as Level_5')
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.u_criticality"]/option[6]').click()
            elif self.Catol[i][1] == 'Level_6':
                print('xxx - process criticality as Level_6')
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.u_criticality"]/option[7]').click()
            else:
                print('CRITICAL Failure to select criticality')
        if i in self.CI_field_excludes:
            print('excluding '+i)
            if i == 'discovery_source':
                print('processing lower '+i)
                self.browser.find_element_by_xpath('//*[@id="cmdb_ci_netgear.discovery_source"]/option[3]').click()
            else:
                continue
        else:
            print('processed under else '+i)
            self.browser.find_element_by_xpath(self.Catol[i][0]).send_keys(self.Catol[i][1])
    # self.browser.find_element_by_xpath(device_save_modification).click()
    sleep(5)
    return

所有的指纹和睡眠都是我试图获得理智,为什么选择是关闭的。下面是self.catol调用的精简版本

代码语言:javascript
复制
    CMDB_CAT = {'name': ['//*[@id="cmdb_ci_netgear.name"]', 'somename'],
    'u_managed_b': ['//*[@id="sys_display.cmdb_ci_netgear.u_managed_by"]', 'IT'],
    'u_common_name' : ['//*[@id="cmdb_ci_netgear.u_common_name"]', 'somecommonname'],
    'u_visible_to' : ['//*[@id="cmdb_ci_netgear.u_visible_to"]', 'IT'],
    'install_status' : ['//*[@id="cmdb_ci_netgear.install_status"]', 'Active'],
    'u_criticality' : ['//*[@id="cmdb_ci_netgear.u_criticality"]', 'Level_3'],
    }

如果u_criticality为“Level_3”,则应设置'//*@id="cmdb_ci_netgear.u_criticality"/option4'.

一切都表明这正在发生,除了字段显示“4级”作为选择。

感谢任何人的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-19 18:20:08

您可以使用selenium select类来选择项目并以well.Please的形式获取文本值。如果有此帮助,请按照options.See进行检查。

代码语言:javascript
复制
from selenium.webdriver.support.ui import Select
select=Select(driver.find_element_by_id('cmdb_ci_netgear.u_criticality'))
select.select_by_index(3) # First item of the select index is always 0
print(select.first_selected_option.text)

代码语言:javascript
复制
select=Select(driver.find_element_by_id('cmdb_ci_netgear.u_criticality'))
select.select_by_value("Level_3")
print(select.first_selected_option.text)

代码语言:javascript
复制
element = driver.find_element_by_xpath("//select[@id='cmdb_ci_netgear.u_criticality']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    option.click()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54762892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档