如何使用Selenium修复Edge浏览器中的ElementNotVisibleException?

时间:2017-10-13 10:05:55

标签: java selenium selenium-webdriver gwt microsoft-edge

我目前正在测试类似于MS Paint的GWT Web应用程序,我面临的问题是我的测试用例传递了Chrome,Firefox和IE等浏览器,但遗憾的是,它在Microsoft Edge浏览器中失败了。在搜索整个互联网并尝试使用Stack Overflow和Google Groups上写的许多方法后,我无法找到解决此问题的方法,我感到非常无望。同时,这是我的代码:

public class Insert_Element_in_Edge {
    private static WebDriver driver;
    @Test
    public void main() throws InterruptedException, IOException
    {
        // TODO Auto-generated method stub
        System.setProperty("webdriver.edge.driver", "D:\\SELENIUM\\Drivers\\MicrosoftWebDriver.exe");
        driver = new EdgeDriver();
        driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
        driver.manage().window().maximize();
        Thread.sleep(3000);
        driver.get("xxxx.com");
        WebDriverWait wait = new WebDriverWait(driver, 20);
        wait.until(ExpectedConditions.titleContains("xxxx"));
        WebElement canvas = driver.findElement(By.id("frontCanvas"));
        Thread.sleep(3000);
        final String InsertPath="//img[contains(@src,'Insert Element')]";
        WebElement Insert = driver.findElement(By.xpath(InsertPath));
        Thread.sleep(3000);
        Insert.click();

      }
   }

这是我面临的错误:

  

org.openqa.selenium.ElementNotVisibleException:未显示元素(警告:服务器未提供任何堆栈跟踪信息)

以下是我试图在Edge浏览器中找到的元素的HTML代码。

<div id="isc_2Q" eventproxy="isc_XXXIconButton_SClient_1" role="button" aria-label="xxx" onfocus="isc.EH.handleFocus(isc_XXXIconButton_SClient_1,true);" 
             onblur="if(window.isc)isc.EH.handleBlur(isc_XXXIconButton_SClient_1,true);" 
             tabindex="1020" style="position: absolute; left: 0px; top: 54px; width: 40px; height: 34px; z-index: 201152; padding: 0px; opacity: 1; overflow: visible; cursor: pointer;" 
             onscroll="return isc_XXXIconButton_SClient_1.$lh()" class="iconHoverZindex">
        <div id="isc_2R" 
            eventproxy="isc_XXXIconButton_SClient_1" style="position: relative; -webkit-margin-collapse: separate separate; visibility: inherit; z-index: 201152; padding: 0px; cursor: pointer;">
          <table role="presentation" cellspacing="0" cellpadding="0" width="40px" height="34px">
            <tbody>
                <tr>
                   <td nowrap="true" class="iconButton" style="background-color:transparent;" align="center" valign="middle" onfocus="isc_XXXIconButton_SClient_1.$47()">
                      <img src="Insert Element.png" width="24" height="24" align="TEXTTOPundefined" class="iconButtonHIcon" eventpart="icon" border="0" suppress="TRUE" draggable="true">
                         &nbsp;
                        <span style="vertical-align:middle;align-content:center;">
                        </span>
                    </td>
                </tr>
            </tbody>
           </table>
        </div>
</div>

此元素在其他3个浏览器中可见,并且已成功单击。但我刚陷入Edge。此外,在Edge中,HTML5画布也不会使用Selenium显示。请帮忙。

8 个答案:

答案 0 :(得分:0)

您可以在点击之前添加wait语句,如下所示。

wait.until(ExpectedConditions.ElementIsVisible(By.xpath(InsertPath)));

答案 1 :(得分:0)

你必须使用元素来解释,因为它是一个按钮

WebDriverWait wait = new WebDriverWait (driver, 50);
final String InsertPath="//img[contains(@src,'Insert Element')]";
WebElement Insert= wait.until(ExpectedConditions.elementToBeClickable(By.xpath(InsertPath)));
Insert.click();

答案 2 :(得分:0)

过去我在Edge,GWT和Selenium中使用xPath的位置元素有些麻烦 可悲的是,我没有找到解决方案,但解决方法: 我们为每个元素提供了一个ID

例如:

panel.getElement().setId("panel-id");

然后使用ID-Locator查找Element:

findElement(By.id("panel-id"))

答案 3 :(得分:0)

我建议您在代码块中进行一些调整,如下所示:

  1. 首先,我们将尝试摆脱所有Thread.sleep(n)来电。
  2. 现在,为了解决ElementNotVisibleException的原因,我们将在Viewport中滚动我们感兴趣的元素,然后调用click()方法。
  3. 您的最终代码块可能会显示:

    driver = new EdgeDriver();
    driver.manage().window().maximize();
    driver.get("xxxx.com");
    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.titleContains("xxxx"));
    WebElement canvas = driver.findElement(By.id("frontCanvas"));
    WebElement Insert = driver.findElement(By.xpath("//div[@id='isc_2R']//td/img[@class='iconButtonHIcon' and contains(@src,'Insert Element.png')]"));
    JavascriptExecutor jse = (JavascriptExecutor)driver;
    jse.executeScript("arguments[0].scrollIntoView()", Insert); 
    Insert.click();
    

答案 4 :(得分:0)

除上述建议外,

确保&#34;你的元素&#34;您正在寻找的内容在浏览器屏幕中可见。意思是,如果元素不可见,用户需要向下滚动才能看到它。驱动程序表现相似。为了防止&#34; ElementNotVisiable&#34;异常确保它在浏览器页面上也可见

试试这个,

Select elm = new Select(driver.findElement(By.Xpath("Your element's Absolute Xpath")));
//Thread.sleep(100);
elm.selectByValue("Dropdown Value which you want to select");

答案 5 :(得分:0)

我阅读了您的问题的答案,可以解决您的问题。 但没有人问你(并且你没有在你的问题中提供)有关 MicrosoftWebDriver Selenium 浏览器版本的信息你在用吗?

Microsoft WebDriver download开始,您使用的是浏览器应支持的版本吗?

EdgeHTML issue tracker,我发现只有2个问题(已修复)与关键元素 ElementNotVisibleException

答案 6 :(得分:0)

在这些情况下,我通常会在发生异常的行前面截取屏幕截图并将其保存到某个地方以便进一步调查。然后我大多必须在此行之前添加一个scrollUp()/ scrollToVisible()函数来解决问题。

答案 7 :(得分:0)

我对 GWT 有同样的问题。无论出于何种原因,都无法直接调用 click。

对我有用的解决方法

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].click()", element);