Selenium Webdriver C#,Chrome,图标隐藏元素并且不可点击[重复]

Posted

技术标签:

【中文标题】Selenium Webdriver C#,Chrome,图标隐藏元素并且不可点击[重复]【英文标题】:Selenium Webdriver C#, Chrome, the icon hides the element and it is not clickable [duplicate] 【发布时间】:2019-01-09 20:10:03 【问题描述】:

更新:主要问题是元素图标隐藏了一个按钮并且无法点击。解决方案是使用 js.Executor 隐藏此图标。

我正在尝试使用 Selenium WebDriver 进行测试,它对我来说是新的,我有一个元素有问题,它不可点击,我尝试通过 linktext 找到它类名cssselector,不起作用。

我已经阅读了很多关于这个问题的文章 "Element is not clickable" ,但还没有找到适合我测试的解决方案。希望你能给我好的建议。

Chrome 版本 67.0.3396.99,64 位 Visual C# 2017 Webdriver 3.13.1.0 版

这是我的脚本:

namespace MK_edit

    class Program
    
        static void Main(string[] args)
        
            IWebDriver driver = new ChromeDriver(@"C:\Users\alina\ProjectLibre");
            driver.Url = "http://test.test.com"; //not real url, I cannot show it
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60); 
            driver.Manage().Window.Maximize();

            //close popup

            driver.FindElement(By.CssSelector("div.whatsnew-content"));
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
            driver.FindElement(By.CssSelector("button.btn.btn-success")).Click(); 
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);

            //edit part

            var lab = driver.FindElement(By.CssSelector("span.glyphicon.glyphicon-edit"));
            lab.Click();


        

    

元素信息:

<li class="allwaysVisible"><a href="#tab-old-edit" data-toggle="tab" title="Map_obj" data-i18n="[title]nav.edit"><span class="glyphicon glyphicon-edit"></span></a></li>

错误信息:

Element <span class=\"glyphicon glyphicon-edit\">
</span> is not clickable at point (312, 24). 
Other element would receive the click: <div class=\"modal-backdrop fade\">
</div>\n

谢谢!

【问题讨论】:

【参考方案1】:

在添加这些元素后,我的元素变得可见和可点击,请 tnx 寻求建议

//open edit

            var lab = driver.FindElement(By.CssSelector("a[title=\"---\"]"));
            var icon = driver.FindElement(By.CssSelector("span.glyphicon.glyphicon-edit"));
            IjavascriptExecutor js = (IJavaScriptExecutor)driver;
            js.ExecuteScript("arguments[0].style='display: none;'", icon); 

            var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
            wait.Until(ExpectedConditions.ElementToBeClickable(lab));

            lab.Click();

【讨论】:

【参考方案2】:

您可以将点击事件替换为动作类,

Actions builder = new Actions(driver);
builder.MoveToElement("Your target element").Click().Perform();

【讨论】:

【参考方案3】:

请在找到 labosana 元素之前添加一些等待

代码:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
wait.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("span.glyphicon.glyphicon-edit")));

var labosana = driver.FindElement(By.CssSelector("span.glyphicon.glyphicon-edit"));
labosana.Click();

【讨论】:

这是错误的答案! @Rajagopalan:这可能是一个正确的答案。在这里,单击按钮后,会显示一些加载弹出窗口。因此,我们需要检查元素可见性,直到模式弹出窗口关闭。 这就是你出现的方式,你现在解释的内容从你的回答中更清楚了,但这仍然是完全错误的。在您的系统中执行并检查它,您就会知道问题所在。 @Rajagopalan:用户尚未分享要测试的 URL。我根据我的经验给出建议。如果是错误的答案,您需要给出有效的建议。 当元素被另一个元素覆盖时,Selenium 不会认为该元素是不可见的。它仍然可见。【参考方案4】:

等到微调器/加载器消失,尝试在这样的方法中传递微调器元素“.modal-backdrop”...

        public static void WaitForNotVisible(IWebElement element, IWebDriver driver)
        
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
            wait.Until(drv =>
            
                try
                
                    if (element.Displayed)
                    
                        return false;
                    
                    return true;
                
                catch
                
                    return true;
                
            );
        

像这样……

var spinnerElement = driver.FindElement(By.CssSelector(".modal-backdrop"));
WaitForNotVisible(spinnerElement, driver);
labosana.Click();

【讨论】:

【参考方案5】:

根据您分享的错误消息,&lt;div class=\"modal-backdrop fade\"&gt; 会收到点击,而不是 &lt;span class=\"glyphicon glyphicon-edit\"&gt;。在div 元素悬停在您的元素之前,您无法与您的元素交互。意思是div,如果是弹窗或者对话框,应该关闭。或者如果它是一个自动消失的元素,你必须等到这个元素不再可见。然后你可以点击你的元素。

我无法提供代码示例来解决您的问题,因为我没有网站链接。希望这会有所帮助。

【讨论】:

以上是关于Selenium Webdriver C#,Chrome,图标隐藏元素并且不可点击[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c#爬虫-selenium检测webdriver封爬虫的解决方法

Selenium WebDriver - 如何使用 C# 设置页面加载超时

通过 Selenium WebDriver C# 获取 HTTP 状态码

在 C# 中使用 Selenium WebDriver 执行 JavaScript

Selenium C# Webdriver如何检测元素是不是可见

如何在 C# 中单击带有 selenium webdriver 的 javascript 确认对话框