【问题标题】:Selenium WebDriver Java - Element is not visibleSelenium WebDriver Java - 元素不可见
【发布时间】:2017-02-14 12:33:27
【问题描述】:

我是 Selenium WebDriver 测试的新手,我尝试在工作中使用它。我尝试了许多选择器、xpath 等的组合,但我无法超越它。我还在stackoverflow上搜索了许多类似的主题,遗憾的是没有预期的结果。我需要的是能够点击“NO SERVICE”按钮(a href)。当我尝试时,我不断收到错误,该元素不可见。当我尝试使用“等待”处理此错误时,我不断收到另一个错误“预期条件失败:等待元素的可见性......”。我做错了什么?

我的代码:

    WebDriverWait waitWait = new WebDriverWait(driver, 40);     
    waitWait.until(ExpectedConditions.visibilityOfElementLocated(By.className("withoutService")));      
    WebElement x = driver.findElement(By.className("withoutService"));
    x.click();

还有来自网页的html代码sn-p:

<div id="fancybox-outer">
    <div id="fancybox-content">
        <div style="width:auto;position:relative;">
            <div id="serviceReminder" style="width: 765px">
                <form id="serviceReminderFrom" method="post">
                    <div class="homeMessage">
                        <div class="innerMessage">
                            <input type="hidden" id="serviceToAddReminderFromAction" name="F_ACTION" value="">
                            <input type="hidden" id="itemsWithServices" name="itemsWithServices" value="">
                            <input type="hidden" name="eventTypeName" value="Something">
                                <div class="ServicesDelivery"><span class="disable-button"></span>
                                    <a href="javaScript:void(0);" rel="3" class="withoutService btn btn-fourth" onclick="registerButtonClickOnPopup('NO SERVICE'); setTimeout(function(){registerButtonClickOnPopup('NO SERVICE');},400);">NO SERVICE</a>
                                    <a href="javascript:void(0)" rel="1" class="next js-tooltip btn btn-second" onclick="registerButtonClickOnPopup('ADD SERVICE'); setTimeout(function(){registerButtonClickOnPopup('ADD SERVICE');},400);">ADD SERVICE</a>
                            <div class="none">
                            </div>
                            <div class="clear"></div>
                        </div>
                    </div>
                </div>
            </form>
        </div></div></div><a id="fancybox-close" style="display: inline;"></a><div id="fancybox-title" class="" style="display: none;">
        </div><a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a><a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a></div>

【问题讨论】:

  • 您要查找的元素包含在 hidden 的输入中,您是否在测试中执行了某些操作以使输入不被隐藏?
  • @Josh,不,它不是隐藏的input 的一部分。 AFAIK,input 元素只能包含属性,不能包含其他节点。

标签: java selenium selenium-webdriver


【解决方案1】:

您的定位器By.className("withoutService") 可以匹配多个元素。您需要更具体的选择器。试试下面的代码:

WebDriverWait waitWait = new WebDriverWait(driver, 40);     
WebElement x = waitWait.until(ExpectedConditions.elementToBeClickable(By.linkText("NO SERVICE")));      
x.click();

【讨论】:

  • 我不认为他收到的错误表明这是多个元素符合标准的问题
  • 对不起,我错误地编辑了您的答案。如果你愿意,你可以拒绝它
  • @Naveen,没关系 :) 但你应该注意,如果元素位于 iframe 内,则可能会得到 NoSuchElementException,但不会得到 ElementNotVisibleException
  • 你是对的:)。但我不太确定ExpectedConditions,因为使用的方法是visibilityOfElementLocated
  • 刚刚确认。我给出了错误的定位器,但仍然得到Expected condition failed: waiting for visibility of element located by By.xpath
【解决方案2】:

尝试以下 XPath:

//a[contains(@class, 'withoutService')]

完整代码:

WebDriverWait waitWait = new WebDriverWait(driver, 40);     
WebElement x = waitWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(@class, 'withoutService')]")));     
x.click();

如果上述代码不起作用,则该元素可能位于 iframe 内。请看我的详细回答here

【讨论】:

  • 其实withoutService是完整的类名,可以和搜索By.className()一起使用。我想,你混淆了 completecompound 类名
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多