如何使用Selenium在页面中的多个子选项卡中传递驱动程序实例?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Selenium在页面中的多个子选项卡中传递驱动程序实例?相关的知识,希望对你有一定的参考价值。

我是Salesforce的新手。我正在尝试在Salesforce页面(Lightning Experience)中进行自动化。我现在正在工作的页面有以下设计,

  1. 搜索框位于页面顶部
  2. 搜索结果作为同一页面中的子选项卡

如何将驱动程序实例传递到同一页面的当前显示的子选项卡?

目前,当我尝试访问新打开的子选项卡的页面元素时,它会抛出异常,因为驱动程序仍然保持第一个打开的选项卡并获取其元素。

答案

您必须从Search Class返回SearchResultTab类对象,该对象初始化子选项卡的元素。试试下面的代码。请阅读在Search类中编写注释的代码。

public class Search {

    private WebDriver driver;       
    @FindBy(css=".LM6RPg")
    private WebElement searchTextBox;

    @FindBy(css = ".vh79eN")
    private WebElement searchButton;

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

    // A method which initializes tab page on submitting search page

    public SearchResults searchInStore(String query) {
        searchTextBox.sendKeys(query + Keys.SPACE);
        searchButton.click();
        return new SearchTab(driver, query);
    }
}

public class SearchTab {

    @FindBy(css="._1ZODb3")
    public WebElement tabElement1;

    @FindBy(how = How.XPATH, using = "//div[@class='_3wU53n']")
    public List<WebElement> tabElement2;



    public SearchResults(WebDriver driver, String query) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
        wait = new WebDriverWait(this.driver,2000);
    }

}

public class SearchTabTest{


   @Test
    public void testProductSearch() {

                Search search = new Search(Browser.driver);
                SearchResults searchResults = search.Search().searchInStore("iphone 5s");
                searchResults.tabElement1.getText();
                searchResults.tabElement2.getText();
    }   

}

public class Browser {

    private static WebDriver driver;

    public static WebDriver driver() {

        System.setProperty("webdriver.chrome.driver", "./resources/browserdrivers/chromedriver.exe");
        DesiredCapabilities caps = DesiredCapabilities.chrome();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--disable-extensions");
        caps.setCapability(ChromeOptions.CAPABILITY, options);
        driver = new ChromeDriver(caps);
        driver.manage().window().maximize();
        return driver;
    }

    public static void open(String url) {
        driver.get(url);
    }

    public static void close() {
        driver.quit();
    }
}

以上是关于如何使用Selenium在页面中的多个子选项卡中传递驱动程序实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个操作栏选项卡中维护多个Fragment堆栈或多个子片段

如何使用 Selenium WebDriver 打开一个新选项卡并启动链接?

未知错误:由于未知错误导致页面崩溃,会话被删除:无法从 ChromeDriver Selenium 崩溃的选项卡中确定加载状态

如何在一个选项卡中使用 Selenium 和 Python 逐一运行测试?

如何在浏览器多个选项卡中处理用户注销?

如何专注于第二个选项卡并使用 selenium webdriver 处理它