@FindBy与Arquillian Graphene

时间:2013-04-29 08:48:03

标签: java jboss-arquillian

实际上我想获得一个用于页面对象模式的@FindBy元素。

我有2个类,第一个是名为TestPage的页面对象,第二个名为PageSaveTest(我的测试发生在那里并调用TestPage)。

我还尝试将@FindByxpathid一起使用。

>>这是我的TestPage

import java.util.List;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

public class TestPage {

  // get autocomplete input 
  @FindBy(css = "input[id*='supplierOps_input']")
  private WebElement autocompleteSupplierOps;

  // getter
  public WebElement getAutocompleteSupplierOps() {
    return autocompleteSupplierOps;
  }

}

>>这是我的PageSaveTest

// How i "inject" my TestPage
@Page
TestPage testpage;

[...]
// My test
WebElement autocomplete = testpage.getAutocompleteSupplierOps();

String keys = "OP";
autocomplete.sendKeys(keys); // >>>>>>> Error throwed here !                
List<WebElement> listSugg = testpage.getSuggestionsSupplierOps();

错误讯息:

org.openqa.selenium.NoSuchElementException : Returned node was not an HTML element.

我的想法:

我认为麻烦来自@FindBy。但我使用this example来构建我的TestPage和我的测试以及this one too

问题:有人可以向我解释@FindBy如何运作并在我的示例中使用?关于石墨烯的文档非常糟糕。


编辑:

我在 TestPage (上图)中修改了我的getter,我尝试过像

这样的id属性值的简单打印
public WebElement getAutocompleteSupplierOps() {
  System.out.println(">>>> "+autocompleteSupplierOps.getAttribute("id"));
  return autocompleteSupplierOps;
}

但仍然是同样的错误,@FindBy已被提升。

Another @FindBy spec要添加此问题。


更新:

我已经修复了我的选择器,但实际上驱动程序会话有一个问题,如:

             page2.getAutocompleteSupplierOps();
   PAGE 1   ---------------------------------->   PAGE 2
driver id:1 ----------------------------------> driver id:2
                                                driver.showPageSource() is empty
return no element found <---------------------- driver.findElement() -> not found    

我使用了3种不同的方式,@FindBy@Drone WebDriver以及@Lukas Fryc向我建议的方式。

2 个答案:

答案 0 :(得分:2)

您可以尝试直接使用驱动程序,而不是使用WebElement注入@FindBy

WebDriver driver = GrapheneContext.getProxy(); // this will be removed in Alpha5 version, use `@Drone WebDriver` instead
WebElement autocompleteSupplierOps = 
    driver.findElement(By.css("input[id*='supplierOps_input']"));

但是它应该给你与@FindBy相同的结果 - 但它会检查问题是否不是由注入引起的,但是出现了一些其他问题。

您可能有错误的CSS选择器 - CSS选择器的支持取决于使用的浏览器及其版本。

您尝试查找的节点不必在页面中,您可能需要等待才能使用等待API或请求警卫显示。

最佳实践是在开发中使用远程可重用会话和真实浏览器 - 它可以快速揭示原因。

答案 1 :(得分:0)

我认为不是使用@FindBy(css ="...")而是尝试@FindBy(xpath="...")我发现它更可靠。