Модель страницы Selenium — как получить атрибут, извлечь его содержимое и использовать его в другом классе

Я хотел бы знать, возможно ли получить содержимое атрибута, расположенного в DOM, и сохранить его как переменную в классе java (класс, который соответствует странице на веб-сайте в соответствии с подходом POM), используя PageFactory из Selenium (@НайтиПо). Затем мне нужно будет использовать эту переменную в другом классе, который соответствует другой странице на том же веб-сайте (объектная модель страницы). Есть ли какие-то примеры и методы, которые кто-то может предоставить? У меня нет кода для представления. Мне просто интересно, возможно ли это технически и как.

----РЕДАКТИРОВАТЬ 1---- В соответствии с просьбой, некоторый код для объяснения. Ниже приведен атрибут в DOM

<label id="HouseNumberVersion">HOUSE N° x </label>

Например, я нахожу этот элемент DOM с помощью PageFactory из Selenium и получаю его содержимое; следующий подход POM (поэтому он называется Page1)

    
public class Page1 {  

 WebDriver driver;
   
 @FindBy (xpath="//*[@id="HouseNumberVersion"]")
   WebElement houseNumber;
  
 public Page1(WebDriver driver){
    PageFactory.initElements(driver, this);
    this.driver = driver;
 }

 public Page1(){
}

 public void assertEquals(){
   String actual = houseNumber.getAttribute("innerHTML");
   //some code here to assert this is equal
   // to another string but not this method is not needed it's just to show that
   // i can use this string in this page properly using this method
 }
 
 public String getHouse(){
  String actual = houseNumber.getAttribute("innerHTML");
  return actual;
}
    
}

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

public class Page2 {  

 WebDriver driver;
 
 //i search for an element in this second page which is an input  
 @FindBy (xpath="//*[@id="HouseInput"]")
     WebElement houseInput;
 
 public Page2(WebDriver driver){
    PageFactory.initElements(driver, this);
    this.driver = driver;
 }

 public void sendActualToInput(){
   
  // i created an object to recover the string within the return method in
  // Page1
  Page1 p = new Page1();
  String number = p.getHouse(); 
  //i send this string recovered from the other 
  // to another string
  houseInput.sendKeys(number);
 }
    
}

И, наконец, я вызываю метод sendActualToInput со страницы 2 в моем основном тестовом сценарии следующим образом.


public class MyTest (){

 public WebDriver driver;
 // some Before Method here ..

 @Test
 Public  void CheckHouse(){
  Page2 p2Object = new Page2(driver);
  p2Object.sendActualToInput();
  //some others actions here..
 }

}

Я пробовал это, но я получил ошибку java.lang.NullPointerException. Консоль Eclipse ссылается на строку String actual = houseNumber.getAttribute("innerHTML"); Кажется, что методу sendActualToInput на странице 2 ничего не возвращается. Потому что, если я помещу sysout в этот метод sendActualToInput, он распечатает содержимое этого sysout в консоли.

Это управляемо?

------EDIT2--------

Я инициализировал свои поля в своем коде. Я просто забыл добавить их во фрагмент, но теперь функции инициализации находятся в коде. И проблема все еще происходит.


person Chaoui05    schedule 29.01.2021    source источник
comment
Можете ли вы показать, что вы ожидаете от псевдокода? Это действительно сложно получить ваш вариант использования.   -  person Alexey R.    schedule 29.01.2021
comment
Готово. Спасибо   -  person Chaoui05    schedule 29.01.2021


Ответы (1)


Вы получаете NullPointerException, потому что ваши поля не инициализированы.

Здесь:

 public void sendActualToInput(){
   
  // i created an object to recover the string within the return method in
  // Page1
  Page1 p = new Page();
  String number = p.getHouse(); 
  //i send this string recovered from the other 
  // to another string
  houseInput.sendKeys(number);
 }    

Когда вы делаете Page1 p = new Page();, он создает объект, в котором все поля null. Чтобы их инициализировать, вам нужно использовать PageFactory.initElements(...)

Итак, в вашем случае вам нужно что-то вроде:

public class Page1 {  

 @FindBy (xpath="//*[@id="HouseNumberVersion"]")
   WebElement houseNumber;

 public void assertEquals(){
   String actual = houseNumber.getAttribute("innerHTML");
   //some code here to assert this is equal
   // to another string but not this method is not needed it's just to show that
   // i can use this string in this page properly using this method
 }
 
 public String getHouse(){
  String actual = houseNumber.getAttribute("innerHTML");
  return actual;
 }

 public Page1(WebDriver driver){
   PageFactory.init(driver, this)
 }
    
}

Вам необходимо обновить вторую страницу соответственно:

public class Page2 {  

 WebDriver driver;
 
 //i search for an element in this second page which is an input  
 @FindBy (xpath="//*[@id="HouseInput"]")
     WebElement houseInput;

 public Page2(WebDriver driver){
    PageFactory.initElements(driver, this);
    this.driver = driver;
 }

 public void sendActualToInput(){
   
  // i created an object to recover the string within the return method in
  // Page1
  Page1 p = new Page(driver);
  String number = p.getHouse(); 
  //i send this string recovered from the other 
  // to another string
  houseInput.sendKeys(number);
 }
    
}
public class MyTest (){

 public WebDriver driver;
 // some Before Method here ..

 @Test
 Public  void CheckHouse(){
  Page2 p2Object = new Page2(driver);
  p2Object.sendActualToInput();
  //some others actions here..
 }

}

Итак, теперь вы инициализируете свою страницу2 с помощью своего драйвера и передаете тот же драйвер конструктору страницы1.

person Alexey R.    schedule 29.01.2021
comment
Извините, я забыл упомянуть, но я уже инициализировал свои поля. Так что инициализация не проблема! - person Chaoui05; 29.01.2021
comment
Обновите свой вопрос соответствующим кодом, где вы получаете NullPointer. Мы найдем решение для вас. - person Alexey R.; 29.01.2021
comment
Большое спасибо. Я сделал правильное обновление. Все уже в посте! - person Chaoui05; 29.01.2021
comment
Page1 p = new Page(); это не получает ссылку драйвера на конструктор - person Alexey R.; 29.01.2021
comment
Что ты конкретно имеешь ввиду? - person Chaoui05; 29.01.2021
comment
Ваш код в примере все еще выглядит непоследовательным. Вы говорите, что все еще получаете NPE (это означает, что у вас есть реальная реализация вашей попытки). Я прошу вас добавить свой тот реальный триал, где вы получаете NPE. - person Alexey R.; 29.01.2021
comment
В основном все находится в этом коде. - person Chaoui05; 29.01.2021
comment
Это событие `Page1 p = new Page();` не будет скомпилировано, потому что у вас нет класса Page. Page1 конструктор ожидает WebDriver, но в этой строке вашего примера вы его не передаете. - person Alexey R.; 29.01.2021
comment
Жаль, что сейчас есть. Именно так, как я выразился в своем коде. Еще раз спасибо - person Chaoui05; 29.01.2021
comment
Давайте продолжим обсуждение в чате. - person Chaoui05; 29.01.2021