我无法访问Web元素的文本

时间:2016-05-18 18:10:05

标签: c# selenium selenium-webdriver

我有一堆radio buttons,并希望从每个标签的标签中获取文字。这是我到目前为止所尝试的:

IList<IWebElement> radioButtons = wd.FindElements(By.Name("Components[0].Entity.ComponentSubTypeId"));
foreach (IWebElement i in radioButtons)
{
   Console.WriteLine(i.Text);
}             

我知道它们存储在List中,因为当我从上面删除.Text时,会将许多OpenQA.Selenium.Firefox.FirefoxWebElement写入输出控制台,并使用它完全匹配页面上radio buttons的数量。

以下是页面上HTML之一的radio buttons

<li class="optionListItem">
   <span class="floatLeftSmallMargin componentTypeOptions">
      <input class="required" id="Components_0__Entity_Entity_ComponentTypeId_PublicationGravure" name="Components[0].Entity.ComponentSubTypeId" type="radio" value="-2147380659" />
   </span>
   <span class="optionListItemText componentTypeOptions">
                        <label for="Components_0__Entity_Entity_ComponentTypeId_PublicationGravure">Publication Gravure</label>
   <span class="helpButton" data-title="Publication Gravure" data-text="A printing method on a substrate that is subsequently formed into books, magazines, catalogues, brochures, directories, newspaper supplements or other types of printed materials.">
   </span>
   </span>
   <div class="clear"></div>
</li>

但是,当我将.Text附加到foreach参数中的索引i时,没有任何内容写入输出控制台。

2 个答案:

答案 0 :(得分:3)

问题是您的IList<IWebElement> radioButtons不包含标签。 它只包含没有任何文本的input。因此,当您执行.Text时,您将看不到任何文字。

IList<IWebElement> labels =  wd.FindElements(By.CssSelector(".optionListItem .optionListItemText label"));

现在迭代labels并致电.Text,您会看到标签名称。

答案 1 :(得分:2)

它没有返回任何内容的原因是因为单选按钮确实没有文本但你选择了它们,这里是.Text如何工作的实际例子:

<li >
    <span id="foo">My text</span>
    <input name="bar" type="radio"/>I'm not part of the radio
</li>

现在让我们从上面提取文本

//This will return "My text"
IWebElement spanText= wd.FindElement(By.CssSelector("#foo")).Text
//This will return empty
IWebElement spanText= wd.FindElement(By.XpathSelector("//input")).Text

在你的情况下它应该看起来像这样

IList<IWebElement> labels =  wd.FindElements(By.CssSelector(".optionListItem .optionListItemText label"));
foreach (IWebElement i in labels)
{
   Console.WriteLine(i.Text);
}