我想要做的是通过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)
答案 0 :(得分:1)
您必须在代码块中处理好几件事。在您的代码块中,您尝试处理3个异常,其中NoSuchElementException
和ElementNotVisibleException
看起来像是一个纯粹的开销,原因如下:
elementA
(即(By.ID, 'myID')
)背后的逻辑,但继续前进并点击elementB
即find_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")