如果元素存在,则将数据行值提取到变量中

时间:2016-01-21 16:13:53

标签: c# selenium selenium-webdriver

基本上我需要做的是如果存在特定元素,则根据所在的行将数据行值提取到变量中。

这是我到目前为止所做的。

if (drive.FindElement(By.XPath("//div[contains(., 'Automation')]")).Displayed)
{
    // Code to extract the variable
}

从下面和上面的代码中可以看出,我需要检查文本Automation是否存在(我上面做过)。然后,我需要将数据行值提取到变量中。

 <td id="browse_row28_col0" style="text-align:left;" class="browseDataCell column0 " data-row="28" data-column="0" onmousedown="event.preventDefault()">
    <div style="width:200px;" class="dontWrapData ">Automation</div>
 </td>

我遇到的问题是我不知道如何从中提取数据,因为data-row的值永远不会相同。我不知道如何根据div“自动化”所在的TD标记提取数据行值。

如果我做了一份糟糕的工作来解释我需要帮助的话,我道歉。如果您有任何疑问,请询问。

1 个答案:

答案 0 :(得分:0)

您可以找到<td>元素并使用get属性提取数据行

string dataRow = drive.FindElement(By.Id("browse_row28_col0")).GetAttribute("data-row");

if(drive.FindElement(By.XPath("//div[contains(., 'Automation')]")).Displayed)中,您不会检查元素是否存在,但是是否显示该元素。

要检查元素是否存在,您可以设置隐式等待

drive.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

要检查元素是否可见,您应该使用显式等待

WebDriverWait wait = new WebDriverWait(drive, TimeSpan.FromSeconds(10));
WebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("[class*='dontWrapData']")));

您还可以使用显式等待存在

wait.Until(ExpectedConditions.ElementExists(By.CssSelector("[class*='dontWrapData']")));

CssSelector将搜索包含“dontWrapData”的class属性。 由于html By.ClassName中的空格,我没有使用class="dontWrapData "

等待将等待最多10秒,以使元素存在/可见。

  

修改

要通过“自动化”文本查找数据行,您可以将所有行放入列表中并使用文本搜索子元素

string dataRow = string.Empty;
IList<IWebElement> rows = drive.FindElements(By.CssSelector("[id*='browse_row']"));
foreach (IWebElement row in rows)
{
    IWebElement div = row.findElement(By.CssSelector("[class*='dontWrapData']"));
    if (!string.IsNullOrEmpty(div.Text) && div.Text.Equals("Automation"))
    {
        dataRow = row.GetAttribute("data-row");
    }
}

您可以按公共部分ID找到所有<td>标记,如果他的子元素包含“自动化”文本,则检查每个标记。如果是,您可以提取“数据行”。