元素有时出现,有时不出现,如何以任何一种方式继续脚本?



我的硒(python(脚本正在一个仪表板的网站上做一些工作,即当我与这个仪表板上的元素交互时,实际的网页/链接不会改变。我提到这一点是因为我考虑简单地通过 driver.get(( 命令跳转不同的链接以避免我现在遇到的一些问题。

在某一时刻,脚本到达仪表板的一部分,由于某种原因,在我的某些测试运行期间有一个元素,而其他时候这个元素不存在。我有几行与这个元素交互,因为它是以我想 .click(( 的另一个元素的方式进行的。因此,当此元素不存在时,我的脚本将停止工作。这是一个脚本,它将在开始时以小的变化重复相同的操作,因此我需要以某种方式集成某种"if"命令。

我的目标是写一些这样做的东西: - 如果此元素不存在,请跳过与其交互的代码行并跳转到下一行操作。如果元素存在,则显然继续。

day = driver.find_element_by_xpath('/html/body/div[4]/table/tbody/tr[4]/td[2]/a')
ActionChains(driver).move_to_element(day).click().perform()
driver.implicitly_wait(30)
lizard2 = driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[1]/img')
ActionChains(driver).move_to_element(lizard2).perform()
x2 = driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[2]')
ActionChains(driver).move_to_element(x2).click().perform()
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

因此,以"lizard2"开头并转到ActionChains行的块是与此元素交互的块,有时很明显,有时在脚本来回执行任务时不会

。前两行只是让我进入具有这个随机出现的元素的仪表板阶段的代码。最后的滚动命令如下。如前所述,我需要忽略中间部分,如果未找到"lizard2"和"x2"元素,请继续滚动部分。

如果这令人困惑且不是很简洁,我深表歉意,我很高兴听到你们的想法并提供任何其他信息/细节,谢谢!

您可以简单地在try/except块中执行find_element_by_xpath,如下所示:

from selenium.common.exceptions import NoSuchElementException
try:
myElement = driver.find_element_by_xpath(...)
#Element exists, do X
except NoSuchElementException:
#Element doesn't exist, do Y

编辑:只是想补充一点,有人在你的问题的评论中建议这种方法是"黑客",它实际上非常Pythonic,非常标准。

private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}

}

由@Lucan回答:

您可以简单地在 try/except 块中执行find_element_by_xpath,如下所示:

from selenium.common.exceptions import NoSuchElementException
try:
myElement = driver.find_element_by_xpath(...)
#Element exists, do X
except NoSuchElementException:
#Element doesn't exist, do Y

相关内容

最新更新