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

Java 如何使用Selenium跨页面中的多个子选项卡传递驱动程序实例?,java,selenium,salesforce,Java,Selenium,Salesforce,我是Salesforce的新手。我正在尝试在Salesforce页面中实现自动化(闪电体验)。我现在工作的页面有以下设计 页面顶部的搜索框 搜索结果作为同一页面中的子选项卡 如何将驱动程序实例传递到同一页面当前显示的子选项卡 目前,当我试图访问新打开的子选项卡的页面元素时,它抛出异常,因为驱动程序仍然保留着第一个打开的选项卡并获取其元素 必须从初始化子选项卡元素的搜索类返回SearchResultTab类对象。试试下面的代码。请阅读在搜索类中编写注释的代码 public class Search

我是Salesforce的新手。我正在尝试在Salesforce页面中实现自动化(闪电体验)。我现在工作的页面有以下设计

  • 页面顶部的搜索框
  • 搜索结果作为同一页面中的子选项卡
  • 如何将驱动程序实例传递到同一页面当前显示的子选项卡


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

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

    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();
        }
    }
    
    公共类搜索{
    私有网络驱动程序;
    @FindBy(css=“.LM6RPg”)
    私有WebElement搜索文本框;
    @FindBy(css=“.vh79eN”)
    私有WebElement搜索按钮;
    公共搜索(网络驱动程序){
    this.driver=driver;
    PageFactory.initElements(驱动程序,this);
    }
    //在提交搜索页面上初始化选项卡页面的方法
    公共搜索结果searchInStore(字符串查询){
    searchTextBox.sendKeys(query+Keys.SPACE);
    搜索按钮。单击();
    返回新的SearchTab(驱动程序、查询);
    }
    }
    公共类搜索选项卡{
    @FindBy(css=“.u1zodb3”)
    公共WebElement选项卡元素1;
    @FindBy(how=how.XPATH,使用=“//div[@class=”'''u 3wU53n']))
    公共列表选项卡元素2;
    公共搜索结果(WebDriver驱动程序、字符串查询){
    this.driver=driver;
    PageFactory.initElements(驱动程序,this);
    wait=newwebdriverwait(this.driver,2000);
    }
    }
    公共类搜索测试{
    @试验
    public void testProductSearch(){
    搜索=新搜索(Browser.driver);
    SearchResults SearchResults=search.search().searchInStore(“iphone 5s”);
    searchResults.tabElement1.getText();
    searchResults.tabElement2.getText();
    }   
    }
    公共类浏览器{
    私有静态WebDriver;
    公共静态WebDriver()驱动程序{
    System.setProperty(“webdriver.chrome.driver”,”/resources/browserdrivers/chromedriver.exe);
    DesiredCapabilities=DesiredCapabilities.chrome();
    ChromeOptions选项=新的ChromeOptions();
    options.addArguments(“--disable extensions”);
    caps.setCapability(ChromeOptions.CAPABILITY,选项);
    驱动器=新的镀铬驱动器(caps);
    driver.manage().window().maximize();
    返回驱动器;
    }
    公共静态无效打开(字符串url){
    获取(url);
    }
    公共静态无效关闭(){
    driver.quit();
    }
    }
    
    我在脚本文件SearchResults SearchResults=agentcare.searchInStore(“XXXX”)中添加了这一行;并具有搜索方法publicsearchresults searchInStore(字符串查询){driver.findelee(By.xpath(searchsaleforce)).sendKeys(query);driver.findelee(By.xpath(searchsaleforce)).sendKeys(key.RETURN);RETURN new SearchResults(driver,query);}并在搜索结果中将我的制表符对象定义为@FindBy(xpath=“//div[contains(@title,'XXXX')]/a”)公共WebElement登录用户;公共搜索结果(WebDriver驱动程序,字符串查询){/}。但无法在脚本中获取LoginUser。请澄清为什么在此步骤后我无法在脚本中获取LoginUser元素。?您必须在逻辑上安排从一个页面类到另一个页面类的方法链,以便访问登录元素。您应该具有类似loginPage.homePage.SearchPage.SearchPageTabResults()的方法;这些是完整示例页面-测试-Amit的链接,搜索文本将打开一个页面,我将登录到该帐户。因此我相信它们是按逻辑排列的。这意味着在搜索框中输入文本并单击“提交”按钮后,应返回LoginPage类对象,登录后将返回SearchResultTab类的obj。