NoSuchElementError:没有这样的元素:无法找到量角器

时间:2016-11-08 12:15:20

标签: css protractor

  

元素(By.xpath((" / HTML /体/格[2] / DIV [3] / MD-含量/ MD-卡/ MD-卡内容/ DIV / DIV / DIV /格/ MD-定制表/ DIV / MD-表容器/表/ THEAD / TR /第[3] /跨度")))点击();

这是我想让它运作的代码。

这是我想要点击的路径

  

/ HTML /体/格[2] / DIV [3] / MD-含量/ MD-卡/ MD-卡内容/ DIV / DIV / DIV / DIV / MD-定制表/ DIV / MD-表容器/表/ THEAD / TR /第[3] /跨度

这是错误

  

消息:       失败:找不到使用定位器的元素:By(xpath,/ html / body / div [2] / div [3] / md-content / md-card / md-card-content / div / div / div / div / md -custom表/ DIV / MD-表容器/表/ THEAD / TR /第[3] /跨度)   堆:       NoSuchElementError:找不到使用定位器的元素:By(xpath,/ html / body / div [2] / div [3] / md-content / md-card / md-card-content / div / div / div / div / md -custom表/ DIV / MD-表容器/表/ THEAD / TR /第[3] /跨度)           at WebDriverError(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/error.js:26:26)           在NoSuchElementError(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/error.js:241:26)           at /usr/lib/node_modules/protractor/built/element.js:717:27           在ManagedPromise.invokeCallback_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1379:14)           在TaskQueue.execute_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2913:14)           在TaskQueue.executeNext_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2896:21)           at /usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2775:27           at /usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:639:7           at process._tickCallback(internal / process / next_tick.js:103:7)错误           在ElementArrayFinder.applyAction_(/usr/lib/node_modules/protractor/built/element.js:403:27)           在ElementArrayFinder._this。(匿名函数)[点击](/usr/lib/node_modules/protractor/built/element.js:101:30)           在ElementFinder。(匿名函数)[点击](/usr/lib/node_modules/protractor/built/element.js:740:22)           在对象。 (/home/vegan/hb-productupload/gateway/src/test/javascript/e2e/account/productDashboard/productDashboardControllerSpec.js:36:47)           at /usr/lib/node_modules/protractor/node_modules/jasminewd2/index.js:94:23           at new ManagedPromise(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1082:7)           在controlFlowExecute(/usr/lib/node_modules/protractor/node_modules/jasminewd2/index.js:80:18)           在TaskQueue.execute_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2913:14)           在TaskQueue.executeNext_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2896:21)           at /usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2820:25       来自:任务:在控制流程中运行它("应该能够将产品仪表板检查为cta")           在对象。 (/usr/lib/node_modules/protractor/node_modules/jasminewd2/index.js:79:14)           at /usr/lib/node_modules/protractor/node_modules/jasminewd2/index.js:16:5           在ManagedPromise.invokeCallback_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1379:14)           在TaskQueue.execute_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2913:14)           在TaskQueue.executeNext_(/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2896:21)           at /usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2775:27       从异步测试:       错误           在套房。 (/home/vegan/hb-productupload/gateway/src/test/javascript/e2e/account/productDashboard/productDashboardControllerSpec.js:33:9)           在对象。 (/home/vegan/hb-productupload/gateway/src/test/javascript/e2e/account/productDashboard/productDashboardControllerSpec.js:8:1)           在Module._compile(module.js:413:34)           在Object.Module._extensions..js(module.js:422:10)           在Module.load(module.js:357:32)           在Function.Module._load(module.js:314:12)

     

1规格,1次失败在13.16秒内完成

     

[15:19:25] I / launcher - WebDriver的0个实例仍在运行   [15:19:25]我/发射器 - 铬#01失败1次测试[15:19:25]   I / launcher - 整体:1个失败的规格[15:19:25] E /启动器 - 进程   退出时出现错误代码1

所以对于同一个地方,这是html:

<span translate="" class="ng-scope ng-binding">Number of Products</span>

这是selecor

body > div.site-content > div.layout-column.flex > md-content > md-card > md-card-content > div > div > div > div > md-custom-table > div > md-table-container > table > thead > tr > th.md-column.ng-scope.ng-isolate-scope.flex.md-sort.md-active > span

对于相同的跨度,这可以点击

 dashboardPageObject.element.all(by.css('[md-order-by="count"]')).get(1);.click();
            browser.driver.sleep(28);
            dashboardPageObject.element.all(by.css('[md-order-by="count"]')).get(1);.click();

点击2次但不等待28秒。

我不关心选择器xpath或css。

例如另一个

/html/body/div[2]/div[3]/header/md-content/md-tabs/md-tabs-wrapper/md-tabs-canvas/md-pagination-wrapper/md-tab-item[5]/span

这个工作

 element(by.xpath('/html/body/div[2]/div[3]/header/md-content/md-tabs/md-tabs-wrapper/md-tabs-canvas/md-pagination-wrapper/md-tab-item[5]/span'));

2 个答案:

答案 0 :(得分:4)

首先,正如我在评论中提到的那样,sleep()计时器需要几毫秒而不是几秒。所以你只用这个命令等待0.28秒。如果你真的想要睡28秒,可以将它扩展到28000。

但是,这不是最佳方法。您应该以Expected Conditions的形式使用隐式等待,以便您的测试有效并以一致的方式执行。

根据您尝试点击的元素的性质,您必须决定哪种方法最适合您,但最终可能会使用presenceOf()visibilityOf()

presenceOf()等待将某些内容附加到DOM

visibilityOf()获取现有元素并等待它可见。

最后,xpath不是一个很好的定位器。它现在可以在您当前的测试中使用,但xpath非常脆弱,因为随着开发的继续,它很容易改变。我建议您找到另一种方法来找到该元素,因为在该特定元素上没有很多属性我可能会选择cssContainingText()

结合以上内容:

var el = element(by.cssContainingText('span', 'Number of Products'));
var EC = protractor.ExpectedConditions;
browser.wait(EC.presenceOf(el), 5000);  // maximum wait of 5 seconds
expect(something).toEqual(your expected result);

答案 1 :(得分:-1)

  1. 这是 po 文件

    import { element, by, ElementArrayFinder, ElementFinder } from 'protractor';
    
    export class scopePos {
      greet() {   
            element(by.xpath("//scope-setup-panel/mat-expansion-panel/div/div/div/div[1]/div[2]/div[2]")).click()// click is not working here
        }
    }
    
  2. 步骤定义文件

    export default function () {
        this.When(/^I verified the event scope card$/, function (next) {
          //z created an object of po file and calling 
          z.greet()         
          next();
        });
    }