使用 Selenium,如何根据关联标签单击单选按钮

Posted

技术标签:

【中文标题】使用 Selenium,如何根据关联标签单击单选按钮【英文标题】:Using Selenium, how to click a radio button based on associated label 【发布时间】:2014-06-24 14:02:55 【问题描述】:

我在 C# 中使用 Selenium,我需要能够根据与该单选按钮关联的标签文本来指定要单击网站上的哪个单选按钮。我需要能够将该文本作为参数传递。以下是单选按钮的代码示例(这是三个按钮):

<input id="radSelect152_222_1369" class="bgRadioNotChecked" type="radio" onclick="BGQ.Ajax.SelectAnswer(this, '152','1369','3', '547');" value="1369" onfocus="BGQ.View.setLastElement(true);" name="radSelect152_222">
<label class="inline" for="radSelect152_222_1369">Watermelon</label>

<input id="radSelect152_222_1370" class="bgRadioNotChecked" type="radio" onclick="BGQ.Ajax.SelectAnswer(this, '152','1370','3', '547');" value="1370" onfocus="BGQ.View.setLastElement(true);" name="radSelect152_222">
<label class="inline" for="radSelect152_222_1370">Papaya</label>

<input id="radSelect152_222_1371" class="bgRadioNotChecked" type="radio" onclick="BGQ.Ajax.SelectAnswer(this, '152','1371','3', '547');" value="1371" onfocus="BGQ.View.setLastElement(true);" name="radSelect152_222">
<label class="inline" for="radSelect152_222_1371">Mango</label>

我希望能够在 Excel 输入文件中指定“Mango”(我的所有文件输入内容都可以正常工作)并让 Selenium 单击相关的单选按钮。我读到的我一直在尝试的一种方法是执行以下操作:

    查找以目标文本(“Mango”)为文本的元素 从该元素获取 FOR 属性 查找 id 等于该 FOR 属性的输入 单击该输入元素。

问题是,我对 Selenium 还很陌生,不太了解如何执行这四个步骤的语法。有人可以用具体的代码示例告诉我方法吗?另外,或者,是否有更好/更智能的方法来做到这一点?如果有,请具体说明。

我在这里包含了我开始编写的方法,我在其中传递了目标文本。我知道这是错误的(尤其是在 By.XPath 部分)。

    public void ClickRadioButtonByLabelText(string labelText)
    
        // (1) Find the element that has the label text as its text
        IWebElement labelForButton = commondriver.FindElement(By.XPath(//label[text()='labelText']));
        // (2) Get the FOR attribute from that element
        string forAttribute 
        // (3) Find the input that has an id equal to that FOR attribute
        // (4) Click that input element
    

谢谢。

【问题讨论】:

为什么不点击标签?因为它们是通过for 属性连接的,所以应该选中相关的复选框。 【参考方案1】:

你有两个选择。

选项 1 - 在单个 XPath 查询中完成所有操作

XPath 查询将是:

//input[@id=//label[text()='TestCheckBox']/@for]

也就是说,从具有“TestCheckBox”的textlabel 中获取具有id 属性的idinput

选项 2 - 从标签中获取属性,然后分步查找元素

public void ClickRadioButtonByLabelText(string labelText)

    // (1) Find the element that has the label text as its text
    IWebElement labelForButton = commondriver.FindElement(By.XPath("//label[text()='labelText']"));

    // (2) Get the FOR attribute from that element
    string forAttribute = labelForButton.GetAttribute("for");

    // (3) Find the input that has an id equal to that FOR attribute
    IWebElement radioElement = commondriver.FindElement(By.Id(forAttribute));

    // (4) Click that input element
    radioElement.Click();

【讨论】:

谢谢,但选项 1 不起作用(我不记得错误,因为我转到选项 2。)另外,选项 2 不起作用。第一行中的 XPath 语法是否正确?有什么遗漏吗?我不断收到一个 no such element 异常,上面写着“无法找到带有 xpath == //label[text()='Other'] 的元素”(“Other”是我正在搜索的文本,我看对了当我使用 Firebug 时,在 选项 1 应该可以工作 - 请重试并告诉我错误,第二个问题尝试 //label[contains(., 'Other')]。我只是使用您在第一篇文章中提供的 XPath,我假设您已经验证了它的工作原理。 谢谢;选项 2 现在可以使用您的新建议。选项 1 仍然无效。我的说法是:IWebElement radio = commondriver.FindElement(By.XPath("//input[@id=//label[text()='Other']/@for]"));我收到了这个错误: Unable to find element with xpath == //input[@id=//label[text()='Other']/@for] @johnnyb1970,尝试用我上面建议的那个替换你的 XPath。之后你还会遇到同样的问题吗? (我知道选项 2 有效,但他们都应该!)。如果您对它感到满意,也请接受答案。 我还应该注意,标签在其文本中具有前导空格,例如:。我不知道为什么;我假设开发人员这样做是为了在标签和单选按钮之间添加更多空间。但在我的 xpath 语句中是否添加那个空格似乎并不重要。我似乎无法让 text() 函数工作。是否可以使用 contains() 函数使其与目标文本完全匹配,而不仅仅是“包含”所提供文本的文本?也就是说,我可以让它表现得像一个“equals()”函数吗?还是已经存在?

以上是关于使用 Selenium,如何根据关联标签单击单选按钮的主要内容,如果未能解决你的问题,请参考以下文章

单选按钮值和提交按钮

Highcharts根据点击进行更改

无法单击跨度Selenium Python中的单选按钮

如何使用 webdriver selenium 从标签中单击按钮

无法单击跨度 Selenium Python 内的单选按钮

自动单击包含相同文本和标签的页面上的多个按钮