【问题标题】:Inconsistent error : element is not attached to the page document不一致的错误:元素未附加到页面文档
【发布时间】:2018-03-25 15:07:22
【问题描述】:

我知道这是一个重复的问题,但我没有得到解决方案,因此再次询问。

我正在使用 selenium C# 并在同一页面上的同一操作中获得上述错误以进行情侣测试。 我的测试在我的本地机器上运行良好,但是当我通过 TFS 在服务器上执行时,相同的测试不一致。

我在测试中进行了更改,因为它在单击操作后重新加载了 DOM,现在我在重新加载后检查对象,它在我的本地机器上工作正常,但在服务器上不一致。 如果选中,我需要取消选中复选框。 我在包含此 CB 的表上使用“.//*[@type='checkbox']”获取复选框(CB)组。

但这产生了同样的错误,所以我改变了我的方法,后来从与复选框相邻的文本中获取单个复选框,但这种方式不一致,并且在我的本地机器上工作,但不在服务器上。

不确定这是怎么回事。 我需要在多个测试中执行此操作,所以我编写了一个通用函数来取消选中 CB

以下是要单击的复选框的 HTML

    <tr>	<td>
            <input id="ContentPlaceHolder1_cblModules_0" type="checkbox" name="ctl00$ContentPlaceHolder1$cblModules$0" checked="checked" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$cblModules$0\',\'\')', 0)" value="0"><label for="ContentPlaceHolder1_cblModules_0">Collector</label>
            </td>
    </tr>
    <tr>	<td>
            <input id="ContentPlaceHolder1_cblModules_1" type="checkbox" name="ctl00$ContentPlaceHolder1$cblModules$1" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$cblModules$1\',\'\')', 0)" value="1">
            <label for="ContentPlaceHolder1_cblModules_1">Maintenance</label>
            </td>
    </tr>
    <tr>	<td>
            <input id="ContentPlaceHolder1_cblModules_2" type="checkbox" name="ctl00$ContentPlaceHolder1$cblModules$2" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$cblModules$2\',\'\')', 0)" value="2">
            <label for="ContentPlaceHolder1_cblModules_2">Manager</label>
            </td>
</tr>

我尝试过的第一种方法

string checkboxList = ".//*[@id='ContentPlaceHolder1_cblModules' and @class = 'checkBoxList']";
IWebElement e1 = SeeElement.GetElement(driver,checkboxList);// internal function to get element
string CBchecked =".//*[@type='checkbox']";
IReadOnlyCollection<IWebElement> ele1 = e1.FindElements(By.XPath(CBchecked));
foreach (IWebElement e in ele1)
                {
                    string isChecked = e.GetAttribute("checked");
                    if (isChecked != null)
                    {
                        e.Click();                            
                    }
                }

在这里我遇到了同样的错误,所以我将方法更改为

 List<string> checkedItems = new List<string>();
 string checkboxList = ".//*[@id='ContentPlaceHolder1_cblModules' and @class = 'checkBoxList']";
 string CBchecked = checkboxList+"//input[@type='checkbox']/following-sibling::label";
IReadOnlyCollection<IWebElement> ele1 = driver.FindElements(By.XPath(CBchecked));
        foreach (IWebElement e in ele1){ checkedItems.Add(e.Text); }
        foreach (string s in checkedItems)
        {
            string xPath;
            xPath = "//*[text()='" + s + "']/preceding-sibling::input[@type='checkbox']";
            IWebElement e;
            e = driver.FindElement(By.XPath(xPath));
            string isChecked = e.GetAttribute("checked");
            if (isChecked != null)
            {
                e.Click();
            }
        }

这在我的本地机器上运行良好,但在服务器上运行不正常。 并且在一些随机运行中,它在一个测试中执行,而在另一个测试中失败。

不知道为什么会这样。

谢谢, 艾米

【问题讨论】:

    标签: c# html selenium selenium-webdriver tfs


    【解决方案1】:

    这是自动化测试中众所周知的错误,陈旧元素异常,您不应该在循环中使用可以更改页面的对象列表/数组/集合。

    当页面更改时,所有当前对象都不会绑定到对象页面,因为不是同一个对象。

    每次点击之前都需要找到元素。

    您应该使用do-whileif,应该看起来像(我没有使用过 c#,所以您可能需要做一些更改)

    do
       string checked = driver.FindElement(By.XPath(xPath_for_checked));
    
       if (checked != null)
           {
                checked .Click();
           }
    
    while (checked != null)
    

    选择器应该是:

    xpath://input[contains(@id, 'ContentPlaceHolder')][@checked]

    css:input[id*=ContentPlaceHolder][checked]

    【讨论】:

    • 我同意你的说法,但是你在 OP 的代码中看到页面发生了变化还是刷新了?
    • 是的,这就是我的第二种方法。我正在创建一个字符串列表,用于查找复选框对象。仍然失败 e = driver.FindElement(By.XPath(xPath));字符串 isChecked = e.GetAttribute("checked");它对此给出错误
    • e.Click(); 中的页面可能会发生变化。您在foreach 中使用ele1,请检查FindElements 的使用位置,另一个问题可能是并非所有元素都具有checked 属性,请注意这一点。
    • 在 ele1 的那个 foreach 中,我只是获取元素的文本值,而不是在页面上执行任何操作。所以我猜dom没有刷新他们的。页面刷新后 e.click() yes 选中的属性只有在复选框被选中时才可用,否则它不可用,还有其他方法可以识别吗?
    • @Amey 类似的线程可能会有所帮助: stackoverflow.com/questions/37781539/…stackoverflow.com/questions/18225997/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多