使用Python和Selenium WebDriver 2在td中根据隐藏的输入值查找祖先tr

时间:2012-09-10 18:06:09

标签: python selenium selenium-webdriver

我正在尝试让WebDriver悬停在表格行上以显示“删除”链接。每行包含一个隐藏的输入,项目名称作为值,并且因为项目名称将由编写测试的人知道(但它出现的特定行不会)我尝试使用项目名称找到行。

我的基本计划是找到输入,然后寻找它的祖先。

我已尝试使用Xpath和CSS,虽然我可以接近(我可以得到输入)但我似乎无法回到元素。由于输入是隐藏的,我不能简单地将鼠标悬停在它上面。

这就是我所拥有的:

def delete_row_by_item_or_task_name(self, item_name=None, task_name=None):
    try:
        if item_name:
            name = item_name
            table_id = 'invoice-items'
        if task_name:
            name = task_name
            table_id = 'invoice-time'
        # tr = self.driver.find_element_by_css_selector("#" + table_id + " input[value=" + name + "]")

        tr = self.driver.find_element_by_xpath("//*[@id='" + table_id + "']/tbody/tr/td/div/div/input[contains(.,'" + name + "')]")
        import pdb; pdb.set_trace()
        self.hover(tr)
        self.driver.find_element_by_link_text('Delete line').click()

CSS选择器工作,如果我放入一个pdb并检查变量'td'是一个web元素。但正如我所提到的,我不能将鼠标悬停在隐藏的输入上并尝试添加/ ancestor :: tr会导致异常(WebDriverException)。

Xpath导致NoSuchElement异常,包含或不包含/ ancestor :: tr

如果缺少任何所需信息,请告诉我,我很乐意提供更多详细信息。

1 个答案:

答案 0 :(得分:0)

根据您的xpath,我假设您的HTML看起来像:

<table id="table_id">
    <tbody>
        <tr>
            <td>
                <div>
                    <div>
                        <input value="item_name" type="hidden" >
                    </div>
                </div>
            </td>
        </tr>
    </tbody>
</table>

如果您希望包含值为“item_name”的输入的<tr>,则可以使用以下xpath:

"//table[@id='" + table_id + "']/tbody/tr[./td/div/div/input[contains(@value, '" + name + "')]]"

这将直接返回<tr>元素,因此您无需查找input元素的祖先。基本上这就是说'找到包含输入元素的tr'。