我想通过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)
2条答案
按热度按时间62lalag41#
在代码块中,您必须注意一些事情。在代码块中,您尝试处理三个异常,其中
NoSuchElementException
和ElementNotVisibleException
在我看来是纯粹的开销,原因如下: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
,您的代码块将如下所示:nhjlsmyf2#
我仍然不知道我的代码出了什么问题。为什么当WebDriver找不到元素时,它不返回任何东西?不管怎样,我从另一个方面来解决这个问题。
1.使用Beautiful Soup解析页面源代码
1.检查按钮是否存在
1.如果存在→驱动程序,请单击它
如果不是→跳过