基本上我需要做的是如果存在特定元素,则根据所在的行将数据行值提取到变量中。
这是我到目前为止所做的。
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标记提取数据行值。
如果我做了一份糟糕的工作来解释我需要帮助的话,我道歉。如果您有任何疑问,请询问。
答案 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>
标记,如果他的子元素包含“自动化”文本,则检查每个标记。如果是,您可以提取“数据行”。