Python + Selenium NoSuchElementException

时间:2016-05-19 13:24:18

标签: python selenium

我的网站上有一个客户端数组,是从我的数据库构建的。在这个数组的每一行中,我都有一个带有链接的字段填充,您可以在其中单击以在另一个页面上重定向(地址是这样的:localhost / display / client / {client_id})

我想做一个循环测试。对于每次迭代,我得到n + 1客户端ID,我点击链接,然后将登录页面与从我刚刚获得的ID构建的字符串进行比较。问题是我的阵列行号没有修复。

我制作了测试代码:

    i = 1
    while self.driver.find_element_by_xpath("//div[@id='wrapper']/table[contains(@class, 'table')]/tbody/tr[" + str(i) + "]").text is not None:
        id = self.driver.find_element_by_xpath("//div[@id='wrapper']/table[contains(@class, 'table')]/tbody/tr[" + str(i) + "]/td[1]").text
        self.assertEqual(i + 1, int(id))
        i = i + 1

它工作得很好,除了我的停止条件行有例外:self.driver.find_element_by_xpath("//div[@id='wrapper']/table[contains(@class, 'table')]/tbody/tr[" + str(i) + "]")

NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//div[@id='wrapper']/table[contains(@class, 'table')]/tbody/tr[7]"}

似乎"不是无"不工作,循环失败。我没有设法找到有关find_element_by_xpath()函数返回值的任何知识。

你知道吗?非常感谢你。

2 个答案:

答案 0 :(得分:0)

While之前尝试此操作,验证该元素是否已启用或显示;可以通过以下方式实现:

例如:

element.isEnabled();

or 

element.isDisplayed();

如果这是真的,继续下一步或返回。希望这能解决你的问题

答案 1 :(得分:0)

如果找不到该元素,则会抛出异常,然后才能执行.text is not None。试试这个:

from itertools import count

for i in count(1):
    elems = self.driver.find_elements_by_xpath("//div[@id='wrapper']/table[contains(@class, 'table')]/tbody/tr[%s]" % i)
    if not elems:
        break
    self.assertEqual(1, len(elems))
    self.assertEqual(i + 1, int(elems[0].find_element_by_xpath("./td[1]").text))

关键更改是find_element s _by_xpath,如果找不到任何元素,则不会引发异常。但是,我们还必须确保它不会返回多个元素。

我还摆脱了i的手动计算,使用了xpath的基本字符串插值,并从td开始发现tr而不是根。 / p>