硒点击按钮隐藏的跨度

问题描述 投票:0回答:2

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

我已设法导航到给定的磁贴并拉出按钮但我无法单击它。

这是我的代码

    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>

帮助理解的屏幕截图 - 每个图块以相同的方式使用隐藏的开始按钮。我的代码适用于第一个瓷砖,但如果我想要第二个或第三个瓷砖,则无法找到开始按钮

Screenshot to help understanding

c# selenium selenium-webdriver
2个回答
0
投票

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

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();

更新

你能尝试删除<button>标签:

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


0
投票

我已经为这个问题做了一个非常优雅的工作。按钮包含在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();
        }
© www.soinside.com 2019 - 2024. All rights reserved.