2016-02-25 3 views
0

Я использую geb для автоматизации веб-приложения. Я хочу определить объект страницы, позвонил ему Page1. в зависимости от среды, Page1 может иметь различное количество элементов кнопки. В одной среде кнопка «A» может существовать, а в другой среде кнопка «A» может отсутствовать.Geb: Определение объектов страницы во время выполнения

Во время выполнения я могу загрузить список ожидаемых кнопок в зависимости от используемой мной среды. Позволяет вызвать этот списокList списка. Я хочу использовать этот список для определения моего объекта страницы во время выполнения.

Теперь это то, что я пытался сделать, чтобы решить эту проблему, но, похоже, она не работает. Я всегда получаю эту ошибку: «groovy.lang.MissingMethodException: Нет подписи метода: groovy.util.slurpersupport.NodeChild.call()»

class Page1 extends Page{ 
    static def buttonList 

    static conntent = { 
     buttonList.each{ button -> 
      button {$(By.xpath("//*[text() = '${button}']")) } 
     } 
    } 
} 

нормально, если бы вы знали, какие кнопки следует ожидать, и они были каждый раз, когда вы определяете объект страницы, как это. но «это» не вариант для меня из-за того, что я объяснил выше.

class Page1 extends Page{ 

    static conntent = { 
     button1 {$(By.xpath("//*[text() = 'button1']")) } 
     button3 {$(By.xpath("//*[text() = 'button3']")) } 
     button4 {$(By.xpath("//*[text() = 'button4']")) } 
     ... 
    } 
} 

в моем верхнем тестовом уровне сценария я инициализировать этот класс, так что я могу предоставить эту страницу объекта в buttonList она требует. это абстракция коды верхнего уровня сценария:

def "Test Case"(){ 
    when: 
     butList = ["button1", "button3", "button4",...] //this list is generated somewhere else. it's not actually hard coded like you see here. the buttons in the list depend on the environment 
     def pageInstance = new Page1() 
     pageInstance.buttonList = butList 
    then: 
     Thread.sleep(30) 
    when: 
     //click something to bring me to the Page1 page 
    then: 
     at pageInstance 
    when: 
     button3.click()//in this case button 3 exists but this is where the code fails 
    then: 
     thread.sleep(5000) 
} 

Я надеюсь, что это то, что некоторые объясняет загадку я нахожусь, я могу идти о решении совершенно неправильном пути.. Я ищу предложения о том, как решить эту проблему. если проблема остается неясной, не стесняйтесь комментировать, и я могу попытаться сделать вещи более ясными.

ответ

0

Если я когда-нибудь застрял в этой ситуации я бы справиться с ней, как это -

class Page1 extends Page{ 

    static content = { 
     allButtons { $("input[type=button]")} 
    } 
} 

Или использовать какой-нибудь другой универсальный селектор для кнопок, которые будут собирать их красиво. Затем, когда я проверяю их, я бы с -

def "Are my buttons here"() { 
    given: "I am on the conundrum causing page" 
     at Page1 

    and: "I have some expected button text list" 
     def expectedButtonText = ["button1","button4","button5","button6"] 

    expect: "All your buttons are belong to us" 
     allButtons*.text == expectedButtonText 
} 

Некоторые это немного общего, но я думаю, что вы можете увидеть образец, просто собрать текст Allbuttons и сравнить с ожидаемым списка, если этот тест пройден то вам следует с радостью обратиться к отдельным кнопкам, как показано ниже.

def "Does my button work"() { 
    given: "I am on the conundrum causing page" 
     at Page1 

    when: "I click on one of the buttons" 
     allButtons.find(text: "button1").click() 

    then: "magic happens" 
     // insert goodness here 
} 

Cheers, Deon.

0

Просто чтобы добавить ответ выше, вы всегда можете использовать флаги ждать или должны играть немного:

static content = 
{ 
    labelBotonEntrar(wait: true,required: false) 
    { 
     $("div.gwt-label.newButton-label",1)  
    } 
} 
0

Я узнал, что я здесь делаю неправильно.

Это:

class Page1 extends Page{ 
    static def buttonList 

    static conntent = { 
     buttonList.each{ button -> 
      button {$(By.xpath("//*[text() = '${button}']")) } 
     } 
    } 
} 

Может быть определен как таковой:

class Page1 extends Page{ 
    static def buttonList 

    static conntent = { 
     buttonList.each{ button -> 
      "${button}" {$(By.xpath("//*[text() = '${button}']")) } 
     } 
    } 
} 

статический контент является хэш-карта, так что я могу dynamiclly определить все ключи/переменные в хэш-карте этот путь ,

Я уверен, что некоторые из тех, кто отвечает на вопросы, отвечают за данную работу, но это то, что я собирался, когда я отправил этот вопрос самостоятельно.

Смежные вопросы