Behat - 在xpath选择器数组中使用示例表String

时间:2014-09-04 11:30:09

标签: php behat mink

我已经使用Behat一年左右,对于大多数网站的自动化水平都很好但我现在需要开始更多地使用它来生成用户生成的内容,我对PHP相对较新,而且我现在正在努力如何使用在x-path数组的Example表中输入的字符串:

Feature: Campaign

Scenario Outline: Pass campaign string to xpath array

Then I add a new campaign name of "<campaign>"

Examples:
|campaign  |
|Automation|

上下文文件如下所示

/**
 * @Then /^I add a new campaign name of "([^"]*)"$/
 */
public function iAddANewCampaignNameOf($campaign)
{
    /**
     * @var CreateCampaign $createCampaign
     */
    $createCampaign= $this->getPage('CreateCampaign');
    $createCampaign->campaignName($campaign);
}

然后我使用Campaign.php类的Page Object扩展名

class CreateCampaign extends AutomationPage
{
protected $path = 'someURL';

public $campaign;

protected $elements = array(
    'campaignHeader' => array('xpath' => "//*[@id='site-navigation-campaigns']"),
);

public function campaignName ($campaign)
{
    $this->campaign = $campaign;
    $this->getSession()->wait(5000);
    $this->getElement('campaignName')->setValue($campaign);
} 

到目前为止,测试人员可以输入“自动化”的广告系列名称 - 它会通过上下文文件传递,并且广告系列名称会在浏览器中设置。

我缺少的是能够保留此$广告系列名称字符串并在另一个页面中使用它,以便我可以在另一个数组中引用它,即选择现有广告系列,如下所示:

SecondPageObjectPage.php

class ReferenceCampaign extends AutomationPage
{
protected $path = 'someURL';


protected $elements = array(
    'referenceCampaign' => array('xpath' => "//*[contains(@id,'***HERE I NEED TO GET THE 
    $campaign value"),
);              

public function editExistingCampaign ($campaign)
    {
    $this->getElement('referenceCampaign')->click();
    }
}

我已尽力简化事情,如果有任何不明确的话,我可以进一步解释 - 希望它只是一个简单的PHP问题而不是特定的Behat具体

2 个答案:

答案 0 :(得分:0)

我确信这是一个简单的问题,但我认为我错过了一个观点。如果你只想获得页面上使用的值,那么你需要检查你的代码结构。首先,您不能将方法参数传递给另一个类中的属性定义,但您可以在editExistingCampaign中找到该元素。

class ReferenceCampaign extends AutomationPage
{
    protected $path = 'someURL';

    public function editExistingCampaign ($campaign)
    {
        $element = $this->find('xpath', '//*[contains(@id, "' . $campaign . '")]');

        if (isset($element)) {
            $element->click();
        } else {
            throw new Exception('Element not found');
        }
    }
}

我假设您正在使用Symfony Page Object扩展,您应该提及。我不确定我的语法是否正确,但我的想法是在方法中找到你的元素。

答案 1 :(得分:0)

谢谢伊恩

你的例子是一种更好的做事方式,我最近才开始使用部分包含,它扩展了查找顽固xpath的灵活性,特别是如果你合并多个,如下面的工作示例:

public function editExistingCampaign ($campaign)
{
    $this->getSession()->wait(5000);
    $element = $this->find('xpath', '//*[contains(@id,"'.$campaign.'")]                                                                                                            
    [contains(@id,"actionbuttons")]');

    if (isset($element)) {
        $element->click();
    } else {
        throw new Exception('Element not found');
    }

}

唯一的微小变化是在x路径的末尾添加一个]