实际上,我想获取@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中修改了我的吸气剂(上面),我尝试了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对我的建议。

最佳答案

您可以尝试直接使用驱动程序,而不是使用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选择器的支持取决于所使用的浏览器及其版本。

您尝试查找的节点不一定要在页面中,您可能需要等待,然后才能使用Waiting API或请求防护措施将其显示。

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

关于java - @FindBy与Arquillian Graphene,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16274596/

10-12 04:00