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

时间:2018-01-10 01:21:28

标签: python selenium

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

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

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内部是整个问题的原因,请你解释为什么会这样,并推荐一个可以研究或实施的可能解决方案?或许我错过了一些基本的东西。

2 个答案:

答案 0 :(得分:1)

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

替换

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

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

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

答案 1 :(得分:0)

你必须在这里处理几点:

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

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

分析

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

  • 评估

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

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

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

所以,

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

解决方案

一个简单的解决方案是:

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