当前位置: 首页 > 知识库问答 >
问题:

如何让Selenium点击不同数量的“下一步”按钮?

计弘
2023-03-14

我有一个内部web应用程序,它有一个模态对话框。不幸的是,我不能在这里发布实际的web应用程序位置,但是让我尽可能地描述一下。

  • 当应用程序启动时,屏幕上会出现一个框,告诉您一堆文本。您可以按“下一页”以获取下一页文本
  • 在最后一页上,“下一步”按钮被禁用,web应用程序的其余UI被启用
  • 页面数量不定,所以我不知道我必须点击“下一步”多少次

我可以点击固定的次数(例如,如果我知道有两个页面,我可以点击两次),但我不知道如何改变这一点,以便它可以在我有多少页面时运行。我想要一个通用的解决方案;据推测,这使用了某种循环来检查按钮是否被启用。如果是,则单击它。如果它被禁用,那么退出循环。

问题是:如何在Selenium中设置重复点击按钮直到禁用的循环?

以下是我尝试过的代码:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0

# Create a new instance of the Firefox driver
driver = webdriver.Firefox()

driver.get("http://localhost/myapp")

try:
    wait = WebDriverWait(driver, 100)    
    wait.until(EC.element_to_be_clickable((By.ID,'menuIntroBox_buttonNext')))    
    driver.find_element_by_id("menuIntroBox_buttonNext").click()

    # Click through the introduction text... this is the problematic code.
    # Here I tried to wait for the element to be clickable, then tried to do a while 
    # loop so I can click on it as long as it's clickable, but it never seems to do the
    # break.
    wait.until(EC.element_to_be_clickable((By.ID,'main_buttonMissionTextNext')))
    while EC.element_to_be_clickable((By.ID,'main_buttonMissionTextNext')):
        element = driver.find_element_by_id("main_buttonMissionTextNext")
        element.click()
        print "Waiting until it's clickable."

        if not element.is_enabled():
            break

    print "Here is where I'd do other stuff.... the stuff I want to actually do in the test case."
finally:
    driver.quit()

共有2个答案

许自强
2023-03-14
While driver.find_element_by_id("main_buttonMissionTextNext").isEnabled() {
  driver.find_element_by_id("main_buttonMissionTextNext").click();
  sleep(1);
}

//sleep function is in java, so you can "translate" it in python 
void sleep(int i){
  driver.manage().timeouts().implicitlyWait(i, TimeUnit.SECONDS);
}

试试看,告诉我怎么了。

仇建茗
2023-03-14

想通了。这是相关的代码块:

wait.until(EC.element_to_be_clickable((By.ID, 'main_buttonMissionTextNext')))
while EC.element_to_be_clickable((By.ID,'main_buttonMissionTextNext')):
    driver.find_element_by_id("main_buttonMissionTextNext").click()
    if not driver.find_element_by_id("main_buttonMissionTextNext").click().is_enabled():
        break
    wait.until(EC.element_to_be_clickable((By.ID, 'main_buttonMissionTextNext')))

我发现了两件事:

    < li >您可以使用< code>is_enabled()检查元素是否已启用。 < li >您必须在单击元素后重新搜索DOM。我猜对话框会自己重画,所以你需要重新找到它。

我可能会重构它看起来更好,但基本的想法现在就在这里。

 类似资料:
  • 我想写一个代码,让Python在页面上抓取一些数据,然后单击页面底部的“下一步”按钮,在第二页上抓取一些数据,单击“下一步”按钮等,直到最后一页,在那里不再可能单击“下一步”(因为没有“下一步”)。 我想尽可能使代码通用,而不是事先指定要做的点击次数。根据这个问题(我如何让Selenium点击可变数量的“下一步”按钮?),我有下面的代码。Python不会报告任何错误,但是程序会在第一次迭代之后停止

  • 问题内容: 我有一个带有模式对话框的内部Web应用程序。不幸的是,我无法在此处发布实际的Web应用程序位置,但是让我尽可能地描述一下。 当应用程序启动时,您会在屏幕上看到一个框,告诉您一堆文本。您可以按“下一页”获取下一页文本。 在最后一页上,“下一步”按钮被禁用,并且Web应用程序的其余UI被启用。 页面的数量是可变的,所以我不知道我必须单击“下一步”多少次。 我可以点击固定的次数(例如:如果我

  • 这是我第一个问题的后续问题,我正在尝试抓取一个网站,让Selenium点击(直到无法点击为止)并收集结果。 这是来自网站的html标签,带有按钮: 我试过这个代码: 我也查过这个问题,但还是没能解决。 有什么想法吗?

  • 我有一个包含36个按钮的响应网站。乍一看,我们只能看到12个按钮,我需要验证它们的文本值,我知道如何做到这一点。但问题是我需要点击下一步按钮,直到它不可见。那么在c#中如何用selenium来做呢? 此外,在单击“下一步”时,我们需要将按钮的文本存储在一个列表或数组中,这样我就可以将所有列表添加到一个新列表中并进行比较。 看看下面的代码,我试过了。 现在上面的工作正常,但当“下一步”按钮不可用时,

  • next:input class=“submit”type=“button”value=“next”onclick=“saveprofile()” 取消:输入class=“提交”type=“按钮”value=“取消”onclick=“GoHome(1)

  • 问题内容: 我正在尝试使用selenium和python 在该特定网站上单击以查看更多信息。这就是我测试的方式,并且出现以下错误 这是可行的: 我想念什么? 问题答案: 这是一个非常简单的运行代码段,该代码段使用XPATH查找按钮“ Se flere”。