python selenium通过xpath查找元素无法捕获异常

时间:2018-01-21 04:06:33

标签: python selenium xpath

我想要做的是通过this page自动播放视频 点击下一个底部,每章末尾有一个没有视频的练习页面,我想跳过它。

跳到下一章按钮元素在每个页面上都是不可见的。

(1)在练习页等待页面加载

(2)找到“跳到下一章”按钮并单击它

(3)在视频页面上跳到下一章是不可见的,所以跳过这个块

但是,我无法捕捉到任何异常,因此该过程卡在next_ = driver.find_element_by_xpath('//*[foo]')行,此行不返回任何内容并永远运行。并且它不会抛出超时异常。

关于如何调试这个的任何想法都可以提供帮助。

try:
    myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID, 'myID')))
    next_ = driver.find_element_by_xpath('//*[foo]')
    next_.click()
except (NoSuchElementException ,ElementNotVisibleException,TimeoutException):
    print('skip this')

更改为

    try:
        WebDriverWait(driver, 1).until(
        EC.element_to_be_clickable((By.XPATH, '//*[contains(concat( " ", @class, " " ), concat( " ", "skip-to-next-chapter", " " ))]'))
    ).click()
    except TimeoutException:
        pass

仍然无效。

从pycharm调试最终停止点:screen shot

当进入EC.element_to_be_clickable((By.XPATH, '//*[contains(concat( " ", @class, " " ), concat( " ", "skip-to-next-chapter", " " ))]'))行时,会转到wait.py>>

    def until(self, method, message=''):
    """Calls the method provided with the driver as an argument until the \
    return value is not False."""
    screen = None
    stacktrace = None

    end_time = time.time() + self._timeout
    while True:
        try:
            value = method(self._driver)# <<<< stopped here!!
            if value:
                return value
        except self._ignored_exceptions as exc:
            screen = getattr(exc, 'screen', None)
            stacktrace = getattr(exc, 'stacktrace', None)
        time.sleep(self._poll)
        if time.time() > end_time:
            break
    raise TimeoutException(message, screen, stacktrace)

2 个答案:

答案 0 :(得分:1)

您必须在代码块中处理好几件事。在您的代码块中,您尝试处理3个异常,其中NoSuchElementExceptionElementNotVisibleException看起来像是一个纯粹的开销,原因如下:

  • 首先,我仍在尝试了解等待elementA(即(By.ID, 'myID'))背后的逻辑,但继续前进并点击elementBfind_element_by_xpath('//*[foo]')
  • 如果您的代码块肯定会生成NoSuchElementException,那么我们必须查看您已经调整的Locator Strategy,如果它唯一标识一个元素并且还要交叉检查该元素是否在{{3}内}}。
  • 如果代码块正在生成ElementNotVisibleException,那么当我们选择 EC 子句时,我们也必须考虑这个因素,例如Viewport
  • 最后,在向前推进时,您尝试在元素上调用click()方法,而不是将 EC 子句作为presence_of_element_located调用presence_of_element_located
  • 所以wait对于一个元素并向前移动到click它的代码块将是:

    try:
        WebDriverWait(driver, delay).until(EC.element_to_be_clickable((By.ID, 'myID'))).click()
    except (TimeoutException):
        print('skip this')
    

答案 1 :(得分:0)

我仍然不知道我的代码有什么问题,为什么WebDriver在找不到元素时不会返回任何内容,无论如何我都是通过其他方式走出这条路。

1,使用Beatifulsoup解析页面源

2,检查按钮是否存在

3,如果存在&gt;司机点击它

如果不是&gt;跳过

src = driver.page_source
soup = BeautifulSoup(src, 'lxml')


next_chap = soup.find('button',class_="btn btn-link skip-to-next-chapter ga")

if(next_chap!=None):
    try:
        driver.find_element_by_css_selector('.btn.btn-link.skip-to-next-chapter.ga').click()
    except Exception as e:
        print(e)
else:
    print("button not exists ,skip")