当前位置: 首页 > 知识库问答 >
问题:

selenium没有点击链接,而在javascript上,链接的点击是完美无缺的

陈晟睿
2023-03-14

我正在使用selenium webdriver单击一个链接,但它抛出了NosuChelementException。我使用的是一个xpath,当我在浏览器的Inspect Element选项卡中执行搜索时,它会找到所需的链接,当我在浏览器控制台中执行下面的javascript时,链接会被优雅地单击,

Javascript代码:

var element = window.top.document.evaluate("//a[@id='clients']/i[@class='icon-chevron-down']" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;if (element != null) { element.click();  } else { alert('Not Found'); }

但不确定为什么selenium会抛出以下异常,我在点击之前尝试了各种显式等待。

org.openqa.selenium.NoSuchElementException: no such element
  (Session info: chrome=42.0.2311.135)
  (Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.9.5 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 45.05 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'VDO105.local', ip: '172.16.0.70', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.5', java.version: '1.7.0_75'
Session ID: b9f85e7103119d4c7b7ff265d02187ca
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=MAC, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/var/folders/1v/pyj3pk396pb0z71_tlqcppgh0000gn/T/.org.chromium.Chromium.TePZ9p}, rotatable=false, locationContextEnabled=true, version=42.0.2311.135, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]

下面是Link的html代码:

<a ng-show="sideBar.length" class="dropdown-toggle toggle-active" id="clients" href="javascript:void(0);">
<i class="icon-group"></i>
<span class="menu-lv-1 ng-binding">Clients</span>
<i class="icon-chevron-down"></i>
</a>

共有1个答案

充运浩
2023-03-14

当页面由JavaScript填充时,通常会发生这种情况。当一个新页面出现时,selenium在完成加载后接收。如果事后改变了一些东西,硒就不会有这些变化。

听起来这是你的问题。

为此,我创建了一些特殊的函数来代替selenium提供的函数。该类包含WebDriver实例。

public void click(final By by){
  act(by, 3, new Callable<Boolean>() {
     public Boolean call() {
       wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
       driver.findElement(by).click();
       logger.info("Button "+stripBy(by) + " clicked");
       return Boolean.TRUE; // FOUND IT
     }
  });}

函数act是一个特殊的函数,用于重试元素上的加速操作。

private void act(By by, int tryLimit, boolean mode, Callable<Boolean> method){
   logger.trace( "Looking for element: " + stripBy(by) );
   driver.manage().timeouts().implicitlyWait( 5, TimeUnit.SECONDS );
   boolean unfound = true;
   int tries = 0;
   while ( unfound && tries < tryLimit ) {
     tries += 1;
     try {

        WebDriverWait wait = new WebDriverWait(driver, 500);
        wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
        wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(by)));
        unfound = !method.call(); // FOUND IT, this is negated since it feel more intuitive if the call method returns true for success
        } catch ( StaleElementReferenceException ser ) {
            logger.error( "ERROR: Stale element exception. " + stripBy(by));
            unfound = true;
        } catch ( NoSuchElementException nse ) {
            logger.error( "ERROR: No such element exception. " + stripBy(by)+"\nError: "+nse );
            unfound = true;
        } catch ( Exception e ) {
            logger.error( e.getMessage() );
        }
    }

    driver.manage().timeouts().implicitlyWait( Constants.DEFAULT_IMPLICIT_WAIT, TimeUnit.SECONDS );

    if(unfound)
       Assert.assertTrue(false,"Failed to locate element by locator " + stripBy(by));}
 类似资料:
  • 问题内容: 我正在FireFox中使用Selenium的IDE进行一些测试,我希望Selenium单击第二个链接(Text2)。知道我该怎么做吗?不幸的是,我无权访问HTML并且无法对其进行修改。记录功能似乎没有注册点击。 该代码附在下面。提前致谢! 问题答案: 硒也支持定位器。如果您知道确切的链接文本,则可以使用此定位器,但不能使用其他定位器。因此,对于上述示例:或。(有关其他定位器,请参见此网

  • 问题内容: 我正在使用JOptionPane来显示一些产品信息,并且需要向网页添加一些链接。 我发现您可以使用包含html的JLabel,因此我提供了一个链接。该链接在对话框中显示为蓝色并带有下划线,但是不可单击。 例如,这也应该起作用: 如何在JOptionPane中获得可点击的链接? 谢谢,保罗。 编辑 -例如解决方案 问题答案: 您可以将任何组件添加到JOptionPane。 因此,添加一个

  • 问题内容: 我正在尝试通过Selenium进行网络抓取。我的问题很简单:如何找到链接,然后如何单击它?例如:以下是我要网页抓取的HTML: 因此,如您所见,“详细信息”是一个链接。 如何使用Selenium找到该链接并单击它? 问题答案: 您可以使用: 例如: 要单击它,只需调用click方法:

  • 我正在使用selenium chrome webdriver用python编写一个脚本,我想点击一个链接。链接本身是: a href=“javascript:contentReplace('/cgi-bin/ssol/9PGaiwzaxu43ZaLXZ8mAix/?p%.5Fr%.5Fid=a5UAMSbnZrZMIowCvr5gzh (我脱下开口 我无法使用find\u element\u by

  • 我有这样的div和超链接: 如何点击这个< code >编辑超链接? 我试了下面的方法,但是对我不起作用

  • 但它不起作用并抛出NoSuchElementException NoSuChelementException:消息:找不到元素:{“Method”:“XPath”,“Selector”:“//A[@href=\”WLSwitchInterFace0.wl\“]”}