【问题标题】:Selenium clicking button hidden by span硒单击按钮被跨度隐藏
【发布时间】:2018-03-01 22:03:41
【问题描述】:

我正在尝试自动化一个环境选择屏幕,其中有多个可选按钮分别被一个跨度隐藏,这些按钮显示为图块。

我已设法导航到给定的图块并拉起按钮,但我无法单击它。

这是我的代码

    public static void NavigateToEnvironment(IWebDriver driver, string environment)
    {
        IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5.00));

        wait.Until(ExpectedConditions.ElementIsVisible(By.XPath($"//span[text()='{environment}']")));
        var tile = driver.FindElement(By.XPath($"//span[text()='{environment}']"));

        Actions action = new Actions(driver);
        action.MoveToElement(tile).Perform();

        wait.Until(ExpectedConditions.ElementIsVisible(By.XPath($"//*[@span=(text()='{environment}')][@btn=(starts-with(text(), 'Start'))]")));

        driver.FindElement(By.XPath($"//*[starts-with(text(), 'Start')]")).Click();

    }

第一部分成功移动到正确的图块并打开跨度,因此屏幕上的按钮在那里。 wait.until 条件也很好,因此 Selenium 可以看到该元素,因此它是我遇到问题的最终点击命令。

似乎只是在寻找隐藏在图块一中的按钮,但我正在尝试图块三。所有按钮都具有相同的 HTML 标签。

在当前代码状态下,我得到元素不可见。

我尝试在等待条件下使用 xpath,但返回参数不是元素,因此再次失败。

我有点不知所措。有什么想法吗?

更新: 其中一个按钮的一些 HTML。这基本上以不同的应用程序名称重复

<li class="trans tile">
                <div class="tileWrap noselect" aria-haspopup="true">
                    <div class="divNavIcon">
                        <span class="spnNavIcon primarycolorfont enable" data-bind="css: Code"></span>
                    </div>
                    <div class="tilePopup primarycolor">
                        <span data-bind="text: ApplicationNameAlias ? ApplicationNameAlias : ApplicationName">Enable QA</span>
                        <span data-bind="text: Description" class="tileSubText">Enable CI Environment</span>
                        <div class="tilePopupToggle">
                            <button type="button" data-bind="click: $parent.startApp, css: { disabled: IsRevoked }" class="btn">Start <i class="fa fa-fw fa-desktop"></i></button>
                            <button type="button" style="display:none;" data-bind="click: $parent.startAppNew, css: { disabled: IsRevoked }" class="btn">Start New <i class="fa fa-fw fa-external-link"></i></button>
                            <button type="button" style="display:none;" data-bind="attr: { &quot;data-target&quot;: &quot;#appPreview_&quot; + ApplicationID }" class="btn" data-toggle="modal" data-target="#appPreview_3043">Preview <i class="fa fa-fw fa-play"></i></button>
                        </div>
                    </div>
                </div>

帮助理解的屏幕截图 - 每个图块的行为方式相同,并带有一个隐藏的开始按钮。我的代码适用于第一个图块,但如果我想要第二个或第三个图块,它找不到开始按钮

【问题讨论】:

  • 请用相关的HTML更新问题。
  • 您能否将您的问题缩小到具体要求,即您究竟想点击哪个元素Start,Start NewPreview
  • 老实说,我对 HTML 的速度并没有那么快,所以不能告诉你为什么那里有 3 个按钮。正如我在屏幕上看到的那样,这是我所追求的“开始”

标签: c# selenium selenium-webdriver


【解决方案1】:

根据您共享的 HTML,单击带有文本为 Start 的按钮,您可以使用以下代码块:

wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='tilePopup primarycolor']//div[@class='tilePopupToggle']/button[@class='btn' and normalize-space()='Start']/i[@class='fa fa-fw fa-desktop']"))).Click();

更新

您可以尝试将&lt;button&gt; 标记删除为:

wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='tilePopup primarycolor']//div[@class='tilePopupToggle']//i[@class='fa fa-fw fa-desktop']"))).Click();

注意:根据aurelia/binding/issues/163 disable.bind 禁用按钮但内部内容仍可点击,我们的目标是i[@class='fa fa-fw fa-desktop']

【讨论】:

  • 这仍然困扰着我遇到的问题。如果它正在寻找第一个图块后面的按钮但在任何其他图块下找不到它,它会完美地工作。我认为它需要由不同的应用程序名称指定这个跨度线&lt;span data-bind="text: ApplicationNameAlias ? ApplicationNameAlias : ApplicationName"&gt;Enable QA&lt;/span&gt;
  • 我无法理解button behind the first tile,但您是否看到任何错误?请使用错误堆栈跟踪更新问题。
  • 我添加了一个屏幕截图来向您展示我的意思。我没有从您的代码示例中得到任何错误,因为它只是超时
  • 查看我的答案更新,让我知道状态。
  • 不幸的是同样的问题。非常感谢您对这一点的帮助
【解决方案2】:

我已经成功地解决了这个问题。这些按钮包含在 li 项目中,所以我只是找到其中相关的一个。

public void NavigateToEnvironment(IWebDriver driver, string environment)
        {
            var tile = driver.FindElement(By.XPath($"//span[text()='{environment}']"),5);

            Actions action = new Actions(driver);
            action.MoveToElement(tile).Perform();

            var tile2 = driver
                    .FindElement(By.XPath("//*[@id='content']/div/div/div/div/ul"))
                    .FindElements(By.TagName("li"))
                    .Where(x => !string.IsNullOrWhiteSpace(x.Text))
                    .ToList();

            var singleTile = tile2.Single(x => x.Text.Contains(environment));
            driver.FindElement(By.XPath($"//*[@id='content']/div/div/div/div/ul/li[{tile2.IndexOf(singleTile) + 1}]/div[1]/div[2]/div/button[1]")).Click();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2019-07-16
    • 1970-01-01
    • 2021-12-08
    • 2013-04-05
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多