Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用XPath或CssPath捕获WebElement的任何方法_Java_Selenium_Selenium Webdriver_Selenium Chromedriver - Fatal编程技术网

Java 不使用XPath或CssPath捕获WebElement的任何方法

Java 不使用XPath或CssPath捕获WebElement的任何方法,java,selenium,selenium-webdriver,selenium-chromedriver,Java,Selenium,Selenium Webdriver,Selenium Chromedriver,我对Java和Selenium非常陌生,所以如果我的问题听起来有点初级,我会提前道歉 我正在使用Selenium和Java编写一个测试。问题是我正在测试的应用程序尚未完成,其开发人员每天都在更改代码。当我使用XPath或CssPath时,它可能会在一段时间后改变,所以我必须通过所有的测试程序来改变那些XPath或Css 有没有其他方法可以不使用Css或XPath访问WebElement?是的,您可以使用ID、nametext。如果您没有ID,您可以要求开发人员为应用程序中的任何元素添加ID是的,

我对Java和Selenium非常陌生,所以如果我的问题听起来有点初级,我会提前道歉

我正在使用Selenium和Java编写一个测试。问题是我正在测试的应用程序尚未完成,其开发人员每天都在更改代码。当我使用XPath或CssPath时,它可能会在一段时间后改变,所以我必须通过所有的测试程序来改变那些XPath或Css


有没有其他方法可以不使用Css或XPath访问WebElement?

是的,您可以使用ID、nametext。如果您没有ID,您可以要求开发人员为应用程序中的任何元素添加ID

是的,您可以添加ID,nametext。如果你没有ID,你可以让开发者在你的应用程序中添加任何元素

如果你不需要使用java,你可以考虑使用机器人框架,它可以让你用高级语言编写代码,这是更快的。 使用Robot框架,您可以使用Xpath、ID、名称、css选择器、标记、dom、jquery等来寻址元素

我认为开发人员不会经常更改标签,是吗


如果你不必使用java,你可以考虑使用机器人框架,它可以让你用高级语言编写代码,这是更快的。 使用Robot框架,您可以使用Xpath、ID、名称、css选择器、标记、dom、jquery等来寻址元素

我认为开发人员不会经常更改标签,是吗


在Selenium中选择webelement有几种不同的方法:

类名ie.By.classNamecontent=> CSS选择器ie.By.cssSelector.content=> ID ie.By.idokButton=> 链接文本ie.By.linkTextCancel=> 部分链接文本,即By.partialLinkTextCa=> 标记名ie.By.tagNameimg=> XPath ie.By.XPath//img[@src='logo.png']=>
此外,如果您可以不受影响,还可以检查页面标题,通过driver.getPageSource查看HTML源代码,并通过模拟鼠标位置和事件进行导航。

在Selenium中选择webelement有几种不同的方法:

类名ie.By.classNamecontent=> CSS选择器ie.By.cssSelector.content=> ID ie.By.idokButton=> 链接文本ie.By.linkTextCancel=> 部分链接文本,即By.partialLinkTextCa=> 标记名ie.By.tagNameimg=> XPath ie.By.XPath//img[@src='logo.png']=>
此外,如果您可以不受影响,还可以检查页面标题,通过driver.getPageSource查看HTML源代码,并通过模拟鼠标位置和事件进行导航。

您应该探索页面对象模型。网络上有很多资源,但一个好的起点是网站上的页面

基本上,每个页面都定义为自己的类,并且在该类中定义了您想要访问的每个元素。使用这个模型有很多优点,但在您的例子中,一个真正的优点是,当事情定期发生变化时,您所要做的就是在页面对象中找到元素的定义并进行更改。将其视为页面的API。您可以在页面对象的后台更改引用,但脚本/测试中构建在该API上的代码不会更改。这是一种基于动态站点更新大量脚本的非常快速的方法。下面是一个使用谷歌主页的快速示例

google主页对象看起来像这样

public class GoogleHomePage
{
    private By searchBox = By.id("lst-ib");
    private By searchButton = By.cssSelector("input[name='btnK']");
    private WebDriver driver;

    public GoogleHomePage(WebDriver driver)
    {
        this.driver = driver;
    }

    public void doSearch(String query)
    {
        getSearchBox().sendKeys(query);
        getSearchButton().click();
    }

    public WebElement getSearchBox()
    {
        return driver.findElement(searchBox);
    }

    public WebElement getSearchButton()
    {
        return driver.findElement(searchButton);
    }
}
public class SimpleTest
{
    public static void main(String[] args)
    {
        FirefoxDriver driver = new FirefoxDriver();
        GoogleHomePage homePage = new GoogleHomePage(driver);
        driver.get("http://www.google.com");
        homePage.doSearch("stack overflow");
        System.out.println(driver.getTitle());
    }
}
测试本身看起来像这样

public class GoogleHomePage
{
    private By searchBox = By.id("lst-ib");
    private By searchButton = By.cssSelector("input[name='btnK']");
    private WebDriver driver;

    public GoogleHomePage(WebDriver driver)
    {
        this.driver = driver;
    }

    public void doSearch(String query)
    {
        getSearchBox().sendKeys(query);
        getSearchButton().click();
    }

    public WebElement getSearchBox()
    {
        return driver.findElement(searchBox);
    }

    public WebElement getSearchButton()
    {
        return driver.findElement(searchButton);
    }
}
public class SimpleTest
{
    public static void main(String[] args)
    {
        FirefoxDriver driver = new FirefoxDriver();
        GoogleHomePage homePage = new GoogleHomePage(driver);
        driver.get("http://www.google.com");
        homePage.doSearch("stack overflow");
        System.out.println(driver.getTitle());
    }
}
所以明天当google重新设计他们的搜索主页并且ID改变时,你进入GoogleHomePage类的两行,更改searchBox和searchButton的定位器,你就完成了。您现有的测试将继续使用这一更改

编辑1:
如果您不想查看完整的页面对象,请在页面顶部定义定位器,这样您就只有一个地方可以更改它们。有关定位器的一些示例,请参见GoogleHomePage类的顶部。当一个站点如此动态时,除了要求开发人员在特定的元素上添加一些永远不会改变的内容之外,你真的无能为力。。。ID、名称等,但其他人已经建议。

您应该探索页面对象模型。网络上有很多资源,但一个好的起点是网站上的页面

基本上,每个页面都定义为自己的类,并且在该类中定义了您想要访问的每个元素。使用这个模型有很多优点,但在您的例子中,一个真正的优点是,当事情定期发生变化时,您所要做的就是在页面对象中找到元素的定义并进行更改。将其视为页面的API。您可以在页面对象的后台更改引用,但脚本/测试中构建在该API上的代码不会更改。这是一种基于动态站点更新大量脚本的非常快速的方法。下面是一个使用谷歌主页的快速示例

谷歌主页 对象看起来像这样

public class GoogleHomePage
{
    private By searchBox = By.id("lst-ib");
    private By searchButton = By.cssSelector("input[name='btnK']");
    private WebDriver driver;

    public GoogleHomePage(WebDriver driver)
    {
        this.driver = driver;
    }

    public void doSearch(String query)
    {
        getSearchBox().sendKeys(query);
        getSearchButton().click();
    }

    public WebElement getSearchBox()
    {
        return driver.findElement(searchBox);
    }

    public WebElement getSearchButton()
    {
        return driver.findElement(searchButton);
    }
}
public class SimpleTest
{
    public static void main(String[] args)
    {
        FirefoxDriver driver = new FirefoxDriver();
        GoogleHomePage homePage = new GoogleHomePage(driver);
        driver.get("http://www.google.com");
        homePage.doSearch("stack overflow");
        System.out.println(driver.getTitle());
    }
}
测试本身看起来像这样

public class GoogleHomePage
{
    private By searchBox = By.id("lst-ib");
    private By searchButton = By.cssSelector("input[name='btnK']");
    private WebDriver driver;

    public GoogleHomePage(WebDriver driver)
    {
        this.driver = driver;
    }

    public void doSearch(String query)
    {
        getSearchBox().sendKeys(query);
        getSearchButton().click();
    }

    public WebElement getSearchBox()
    {
        return driver.findElement(searchBox);
    }

    public WebElement getSearchButton()
    {
        return driver.findElement(searchButton);
    }
}
public class SimpleTest
{
    public static void main(String[] args)
    {
        FirefoxDriver driver = new FirefoxDriver();
        GoogleHomePage homePage = new GoogleHomePage(driver);
        driver.get("http://www.google.com");
        homePage.doSearch("stack overflow");
        System.out.println(driver.getTitle());
    }
}
所以明天当google重新设计他们的搜索主页并且ID改变时,你进入GoogleHomePage类的两行,更改searchBox和searchButton的定位器,你就完成了。您现有的测试将继续使用这一更改

编辑1:
如果您不想查看完整的页面对象,请在页面顶部定义定位器,这样您就只有一个地方可以更改它们。有关定位器的一些示例,请参见GoogleHomePage类的顶部。当一个站点如此动态时,除了要求开发人员在特定的元素上添加一些永远不会改变的内容之外,你真的无能为力。。。ID、名称等,但其他人已经提出了建议。

如果所有元素都在频繁更改,我建议您停止自动化项目。可变电压产品不适用于自动测试


因此,如果您有责任执行自动测试或回归,并且必须通过java&selenium webdriver进行控制,那么我建议您编写一个简单的框架,甚至是一个网页和几个数据文件。包装内部逻辑和操作,并在WebUI中维护Xpath/CSS或其他选择器。希望有帮助。

如果所有元素都在频繁更改,我建议您停止自动化项目。可变电压产品不适用于自动测试


因此,如果您有责任执行自动测试或回归,并且必须通过java&selenium webdriver进行控制,那么我建议您编写一个简单的框架,甚至是一个网页和几个数据文件。包装内部逻辑和操作,并在WebUI中维护Xpath/CSS或其他选择器。希望能有所帮助。

我就是这么做的,但他们更忙的是能够完成他们编写的所有程序,并为每个组件添加ID或名称。对不起,没有其他方法了!!这就是我所做的,但他们更忙的是能够通过他们编写的所有程序,并为每个组件添加ID或名称对不起,没有其他方法了!!我需要使用Java,你指的是哪个机器人框架?事实证明,你也可以将Java与机器人框架结合使用。看看这个@LovelyJava,我添加此评论是为了给您一个通知,以便您可以尽快阅读我上面的评论。转到您发送的链接,但没有Java性能,我需要使用Java,您指的是哪种机器人框架?事实证明,您也可以将Java与机器人框架一起使用。看看这个@LovelyJava,我添加此注释是为了给您一个通知,以便您可以尽快阅读我上面的注释。转到您发送的链接,但没有Java性能