使用Python在Selenium中通过XPath查找元素无法捕获异常

k4aesqcs  于 2022-11-24  发布在  Python
关注(0)|答案(2)|浏览(266)

我想通过this page点击下一页底部自动播放视频,但是在每一章的最后都有一个练习页没有视频,我想跳过它。
每个页面上都有skip-to-next-chapter按钮元素,只是看不见而已。
(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调试最终停止点:
Screenshot
进入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)
62lalag4

62lalag41#

在代码块中,您必须注意一些事情。在代码块中,您尝试处理三个异常,其中NoSuchElementExceptionElementNotVisibleException在我看来是纯粹的开销,原因如下:

  • 首先,我仍在尝试理解等待elementA(即(By.ID, 'myID'))的逻辑,但继续前进并单击elementB(即find_element_by_xpath('//*[foo]')
  • 如果您的代码块生成NoSuchElementException,我们肯定要查看您所采用的**Locator Strategy**,看它是否唯一标识了一个元素,并交叉检查该元素是否在Viewport内。
  • 如果您的代码块生成ElementNotVisibleException,则在选择EC子句(例如,presence_of_element_located)时,还必须考虑此因素。
  • 最后,继续尝试对元素调用click()方法,而不是将EC子句作为presence_of_element_located,您应该使用**element_to_be_clickable(locator)**
  • 因此,将wait作为一个元素,并将其向前移动到click,您的代码块将如下所示:
try:
     WebDriverWait(driver, delay).until(EC.element_to_be_clickable((By.ID, 'myID'))).click()
 except (TimeoutException):
     print('skip this')
nhjlsmyf

nhjlsmyf2#

我仍然不知道我的代码出了什么问题。为什么当WebDriver找不到元素时,它不返回任何东西?不管怎样,我从另一个方面来解决这个问题。
1.使用Beautiful Soup解析页面源代码
1.检查按钮是否存在
1.如果存在→驱动程序,请单击它
如果不是→跳过

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")

相关问题