当前位置: 首页 > 面试题库 >

如何使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()

问题答案:

弄清楚了。这是相关的代码块:

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

我发现了两件事:

  1. 您可以使用检查元素是否已启用is_enabled()
  2. 单击该元素后,您必须在DOM中重新搜索。我猜测对话框会重绘,因此您需要再次查找它。

我可以将其重构为更好的外观,但是基本思想就在这里。



 类似资料:
  • 我有一个内部web应用程序,它有一个模态对话框。不幸的是,我不能在这里发布实际的web应用程序位置,但是让我尽可能地描述一下。 当应用程序启动时,屏幕上会出现一个框,告诉您一堆文本。您可以按“下一页”以获取下一页文本 在最后一页上,“下一步”按钮被禁用,web应用程序的其余UI被启用 页面数量不定,所以我不知道我必须点击“下一步”多少次 我可以点击固定的次数(例如,如果我知道有两个页面,我可以点击

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

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

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

  • 我正试图让JQuery在按下下一个按钮时自动单击该按钮。在互联网上,我发现应该是这样的(查看JQuery部分)。但由于某种原因,它不起作用。 它们必须在同一个代码中吗? 我尝试过的:JQuery: 表单中的按钮1 HTML: 表单中的按钮2 HTML:

  • 我正在从分页的网页中抓取数据,一旦我抓取完一页,我需要单击下一个按钮并继续抓取下一页。一旦我抓取了所有页面并且下一个按钮不再存在,我就需要停止。下面包含我需要单击的“下一步”按钮周围的html。 我尝试过在类和链接文本上选择,但在我目前的尝试中,这两种方式都不适合我。 我的代码的2个例子: 我在网上找到的所有解决方案都不起作用,并且主要以以下错误结束: 如果错误代码的其余部分对审查有帮助,请告诉我