我正在尝试自动化一个环境选择屏幕,其中有多个可选按钮被一个跨度单独隐藏,这些按钮显示为平铺。
我设法导航到给定的磁贴并拉出按钮但我无法点击它。
这是我的代码
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: { "data-target": "#appPreview_" + ApplicationID }" class="btn" data-toggle="modal" data-target="#appPreview_3043">Preview <i class="fa fa-fw fa-play"></i></button>
</div>
</div>
</div>
帮助理解的屏幕截图 - 每个图块都以相同的方式使用隐藏的开始按钮。我的代码适用于第一个瓷砖,但如果我想要第二个或第三个瓷砖,则无法找到开始按钮
答案 0 :(得分: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 禁用。禁用按钮但内部内容仍可点击,我们定位
i[@class='fa fa-fw fa-desktop']
答案 1 :(得分: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();
}