尝试除了在python / selenium中仍然抛出NoSuchElementException错误

Try except in python/selenium still throwing NoSuchElementException error

我试图在python中使用selenium捕获一些网站元素,我正在使用try / except,以防在该特定页面中找不到特定元素。这一切都很好,但是脚本仍会抛出NoSuchElementException,即使我期待它并告诉脚本以某种方式处理它或通过它。

我唯一能想到的可能是一个问题就是这个try / except嵌套在另一个try / except中,所以我就是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for month in (month_start, month_end):

    for date in (date_start, date_end):

        try: #this is just a general try in case there is a breakdown in finding one of the elements
            driver.get(url)
            results = driver.find_elements_by_xpath("""//*[@class="results"]/div""")

            for result in results:
                sample_element = result.find_element_by_xpath("blah").text

                #seems to be where the problem starts
                specific_element =""
                try:
                    #this is a specific element that I know may not exist
                    specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
                except NoSuchElementException:
                    specific_element =""
                    #I have tried pass instead as well with no luck
                #throws an error here and won't continue if the specific element is not found
        except:
            #pretty much a copy of the above try with some changes

所以我一般认为我对python中的try / except函数有一个很好的理解,但这是我的头脑。"结果结果"循环将很乐意继续,直到它找不到specific_element并且只抛出一个"selenium。 common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:"

如果嵌套在try / except中是整个问题的原因,请你解释为什么会这样,并推荐一个我可以研究或实现的可能的解决方案?或许我错过了一些基本的东西。


我不做python但如果是我,我会删除所有的try / catches并用find_elements_*替换它们并检查空列表。例如

更换

1
specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text

1
2
3
elements = result.find_elements_by_xpath(".//*[@class='specific']/div")
if elements
    specific_element = elements[0]

这基本上只是确保在访问它之前找到任何元素,并且您可以避免所有尝试/捕获。我认为异常应该是特殊的......很少见。它们不应被期望或用作流量控制等。


你必须在这里处理几点:

  • try driver.get(url)并非绝对必要
  • 问题出在以下块中:

    1
    2
    try:
        specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text

分析

try()实际发挥作用之前,您已尝试过一系列事件:

  • 评估

    1
    result.find_element_by_xpath(""".//*[@class="specific"]/div""")
  • 下一个

    1
    result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
  • 下一个

    1
    specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text

所以,

  • 一旦result.find_element_by_xpath(""".//*[@class="specific"]/div""")失败但NoSuchElementException被引发,try仍然保持沉默。

一个简单的解决方案是:

1
2
3
4
5
6
7
8
try:
    specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""")
    specific_element_text = specific_element.text
    # other works

except NoSuchElementException:
    specific_element =""
    # other works