【问题标题】:Getting children elements with protractor使用量角器获取子元素
【发布时间】:2016-07-19 14:31:08
【问题描述】:

我是 Protractor 和一般 Web 开发的新手,我来自 Java 背景。我正在测试 Web 应用程序,但在尝试从元素中获取文本时遇到问题。

所以代码是这样组织的

<parent>
  <parent2>
    <child>
      <target-element>

code 我附上了一张带有代码的图片。我的问题是有几个具有相同类名和标签名的子元素。我正在尝试按索引提取它们,然后尝试从目标元素中读取文本,但它返回一个空字符串。因此,从图像中,我试图从名称标签“文本”中检索文本“TU”,但我似乎无法做到这一点。这是我尝试过的事情之一。

var first = element.all(by.css('.nvd3.nv-wrap.nv-axis g')).get(2);
expect(first.getText()).toBe('TU');

我尝试检查项目是否正在显示,但它只会检查找到的第一个项目

expect(ecmSummaryTile.implementedPlot.element(by.css('.tick')).
   isDisplayed()).toBe(true);

基于 Protractor 文档中的这些示例,它们仅显示具有一个父元素的示例,但在这种情况下,我正在使用的代码有点复杂。任何人都可以阐明如何做到这一点吗?

代码更新 这是代码的结构。不幸的是,我无法提供完整的代码,因为它对于我的公司来说非常庞大,所以我无法粘贴整个源代码。但我正在使用的项目的完整结构如下

<div class = "ecm-summary-chart-container">
<nvd3 class = "ng-isolate-scope">
    <svg class = "nvd3-svg">
        <g class = "nvd3 nv-wrap nv-lineChart">
            <g>
                <g class="nv-legendWrap">
                    <g class="nv-focus">
                        <g class="nv-x nv-axis nvd3-svg">
                            <g class="nvd3 nv-wrap nv-axis">
                                <g>
                                    <g class="tick">
                                    .
                                    .
                                    .

我知道我可以使用嵌套元素(by.css)找到该元素并继续向下直到找到该元素,但是我有多个具有相同类名的元素,这就是我不这样做的原因

【问题讨论】:

    标签: html angularjs protractor


    【解决方案1】:

    var first = element.all(by.css('.nvd3.nv-wrap.nv-axis g')).get(2);

    我认为你在正确的轨道上,除了我会在此处添加一个直接的父子关系并调用first()以获取第一个g

    var first = $$('.nvd3.nv-wrap.nv-axis > g').first();
    var text = first.$('.tick text');
    
    expect(text.getText()).toEqual("TU");
    

    您可能还需要等待元素具有TU 值:

    var EC = protractor.ExpectedConditions;
    browser.wait(EC.textToBePresentInElement(text, "TU"), 10000);
    
    expect(text.getText()).toEqual("TU");
    

    【讨论】:

    • 我试过了,得到了同样的反应。我相信返回一个空字符串是正确的响应,因为第一个 g 只是所有其他 g 的父级,这些 g 实际包含我要检索的值我尝试将其更改为 var first = $$('.nvd3. nv-wrap.nv-axis > g').get(1);但仍然遇到同样的问题,它返回一个空字符串 Expected '' to equal 'TU'
    • @JoseHernandez 好的,更新了一个猜测,看看吧。
    • 这似乎没有帮助,我不断收到错误消息,指出找到了多个元素,并会选择第一个元素,然后是超时错误。我尝试更新等待时间并使用 get() 而不是 first() 但没有得到更好的结果
    • @JoseHernandez 好的,没问题,你能发布页面的完整 HTML 源代码吗?谢谢。
    【解决方案2】:

    您提到的定位器似乎不正确(忘记再包含一个标签“g”)。希望下面的代码能解决您的问题。

    代码片段:

     element.all(by.css('.nvd3.nv-wrap.nv-axis>g>g')).each(function(element, 
            index) {
                // will get each element
                 element.getText().then(function (text) {
                 console.log(index, text);
                  });
               });
    

    【讨论】:

    • 这似乎在打印元素时有效,但如果我尝试使用 '>g>g' 以及其他选项,例如 first() 或 get() 我仍然无法检索价值观。可能是我定位错误的父元素。我需要调查一下。运行时我得到以下输出 0 '' 1 '' 2 '' 3 '' 4 '' 5 '' 6 '' 7 '' 8 '' 9 '' 10 'TU' 11 'WE' 12 'TH' 13 'FR' 14 'SA' 15 'SU' 16 'MO' 17 '' 18 'TU' 19 'WE' 20 'TH' 21 'FR' 22 'SA' 23 'SU' 24 'MO' 25 '' 26 '' 27 '' 28 '' 29 '' 30 'TH' 31 'FR' 32 'SA' 33 'SU' 34 'MO' 35 'TU' 36 'WE'
    • element.all(by.css('.nvd3.nv-wrap.nv-axis>g>g')).first().then(function(ele){ ele.getText( ).then(function(txt){ console.log(txt) } ); });
    • @JoseHernandez 如果不起作用,请尝试以上一个。添加我的 Skype id -'sallojusuresh'。我可以帮你
    • 我遇到了一个错误,经过快速搜索后,我将其更新为 var x = element.all(by.css('.nvd3.nv-wrap.nv-axis>g>g')) 。第一的(); x.getText().then(function(txt) { console.log("txt: " + txt); });我仍然得到一个空字符串。
    • 我在日志中看到“为定位器找到了多个元素 By(css selector, .nvd3.nv-wrap.nv-axis) - 第一个结果将被使用”但是我没有在 html 代码中看不到另一个遵循相同结构的元素,但量角器可能正在寻找另一个元素。我会尝试更多的事情,看看我是否能解决它@SureshSalloju,我会添加你并让你知道我是否继续遇到这个问题。谢谢
    【解决方案3】:

    你试过了吗?

    var text = $('.nvd3.nv-wrap.nv-axis > g').get(2);
    
    expect(text.getText()).toEqual("TU");
    

    【讨论】:

    • 所以我做了以下 var foo = element.all(by.css('.nvd3.nv-wrap.nv-axis>g text'));期望(foo.getText()).toBe('TU');并得到预期['','','','','','','','','','','','','','','TU', 'WE'、'TH'、'FR'、'SA'、'SU'、'MO'、''、''、''、'0'、'8'、'TU'、'WE'、' TH'、'FR'、'SA'、'SU'、'MO'、''、''、''、''、'0'、'106'、''、''、'0'、' 37'、''、''、''、'0'、'1'、'TH'、'FR'、'SA'、'SU'、'MO'、'TU'、'WE'、'' ] 为“TU”。
    猜你喜欢
    • 2015-11-30
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多