selenium--各种元素的操作

时间:2022-03-10 21:56:37

生成一个web对象

IWebDriver driver;
driver = new FirefoxDriver();

selenium打开浏览器

package org.coderinfo.demo; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class StartBrowser { public static void main(String[] args) { /* * 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置 例如: * System.setProperty("webdriver.firefox.bin" * ,"D:\\Program Files\\Mozilla Firefox\\firefox.exe"); */ WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com.hk"); }

跳转到指定页面
driver.Navigate().GoToUrl(baseURL + "/");
driver.title 取得当前页的title
driver.url 取得当前页的url

输入框(text field or textarea)

找到输入框元素:IWebElement element = driver.findElement(By.id("passwd-id"));

在输入框中输入内容:

element.sendKeys(“test”);

将输入框清空:

element.clear();

获取输入框的文本内容:

element.Text;

单选项

 if (CreatePassengerPage.getInsurance().Selected == false)
  {
        CreatePassengerPage.getInsurance().Click();
  }

下拉选择框(Select)

 SelectElement selectCity=new SelectElement(driver.FindElement(By.Id("City")));

(1)通过下拉框的索引选中第二项                    selectCity.SelectByIndex(2);      

(2)通过下拉列表中的选项的value属性选中      selectCity.SelectByValue("10");

(3)通过下拉列表中的选项的Text属性选中      selectCity.SelectByText("北京");

下拉选择    SelectElement feeBasisDDL = new SelectElement(newRule.getFeeBasisDDL());    feeBasisDDL.SelectByText(CaseData["FeeBasis"].ToString()); 定位frame中元素 (1)进入frame   driver.SwitchTo().Frame("frame");
(2)定位元素
  driver.FindElement(By.Id("div1"));
  driver.FindElement(By.Id("input1"));
(3)退出frame
  driver.SwitchTo().DefaultContent();
如何处理alert、confirm、prompt对话框
(1)取得alert框信息
    Html代码:
    <input id = "alert" value = "alert" type = "button" nclick = "alert('欢迎!请按确认继续!');"/> 
        driver.FindElement(By.Id("alert")).Click();
        IAlert alert = driver.SwitchTo().Alert();
        Console.WriteLine(alert.Text);
        confirm.Dismiss(); //点弹框关闭
(2)取得输出对话框上面的文字
    Html代码:
    <input id = "confirm" value = "confirm" type = "button" nclick = "confirm('确定吗?');"/>
        driver.FindElement(By.Id("confirm")).Click();
        IAlert confirm = driver.SwitchTo().Alert();
        Console.WriteLine(confirm.Text);
        confirm.Accept(); //点击确定
(3)点击按钮,输入名字,然后点击确认
    Html代码:
    <input id = "prompt" value = "prompt" type = "button" nclick = "var name = prompt('请输入你的名字:','请输入 
    你的名字'); document.write(name) "/>
        driver.FindElement(By.Id("prompt")).Click();
        IAlert prompt = driver.SwitchTo().Alert();
        Console.WriteLine(prompt.Text);
        prompt.SendKeys("Hello");
        prompt.Accept(); //点击确定
执行js脚本
((IJavaScriptExecutor) driver).ExecuteScript("js")

<input id="FHX_txtFromDate" type="text" readonly="readonly" name="FromTime" autocomplete="off" placeholder="yyyy-mm-dd" style="background-image: url("http://pic.c-ctrip.com/cquery/pic_aftertomorrow.png"); background-position: right center; background-repeat: no-repeat;"/>

l在实际编写脚本的过程中经常会遇到很多元素的属性是readonly的,表示此元素只读,不可进行赋值操作(此类情况常出现于日历框组件中)l对于此类元素如果希望变更他的值,对于直接操作日历框会比较复杂,日历框的元素表达是按天拼接的,如果直接操作会需要做较多的运算和处理l对于此类元素,只能通过JS修改元素的属性,去掉只读属性后就可以直接赋值了
修改元素属性方法

/// <summary>

        /// 设置元素只读属性为否

        /// </summary>

        /// <param name="type">ById、ByName、ByTagName</param>

        /// <param name="value">value</param>

        public void setReadOnlyFalseByAttribute(string type, string value)

        {

            string js = "";

            switch (type)

            {

                case "ById":

                    js = "document.getElementById('" + value + "').readOnly=false;";

                    break;

                case "ByName":

                    js = "document.getElementsByName('" + value + "').item(O).readOnly=false;";

                    break;

                case "ByTagName":

                    js = "document.getElementsByTagName('" + value + "').item(O).readOnly=false;";

                    break;

            }

            ((IJavaScriptExecutor)driver).ExecuteScript(js);

        }

findElenments中找某一个元素       int num = driver.FindElements(By.XPath("//div[text()='更多支付方式']")).Count;       if (Convert.ToBoolean(num))           {                CreatePayPage.getMorePay().Click();           }IWebDriver driver = new FirefoxDriver();
INavigation navigation = driver.Navigate();
navigation.GoToUrl(http://www.baidu.com);
navigation.GoToUrl("http://tieba.baidu.com/f/search/adv");
IWebElement select = driver.FindElement(By.Name("sm"));
string targetText = "按相关性排序";
System.Collections.Generic.IList<IWebElement> ptions = select.FindElements(By.TagName("option"));
for (int i = 0; i < options.Count; i++)
{
if (options[i].Text == targetText)
{
options[i].Click();
}
}
javaWebDriver driver = new FirefoxDriver();
Navigation navigation = driver.navigate();
navigation.to(http://www.baidu.com);
navigation.to("http://tieba.baidu.com/f/search/adv");
WebElement select = driver.findElement(By.name("sm"));
String targetText = "按相关性排序";
java.util.List<WebElement> ptions = select.findElements(By.tagName("option"));
for (int i = 0; i < options.size(); i++)
{
if (options.get(i).getText().equals(targetText))
{
options.get(i).click();
}
}
   try            {              if (driver.WindowHandles.Count > 0)              {                   //选择乘客,下一步核对                    PassengerBusiness Passenger = new PassengerBusiness(driver, CaseData, CheckData);                    Passenger.PassengerMessage(path, casename);                    //支付并验证                    PayEntryBusiness PayEntry = new PayEntryBusiness(driver, CaseData, CheckData);                    PayEntry.Pay(path, casename);                }            }            catch (Exception e)            {                Log.Info("搜索时异常,直接pass用例");            }判断页面是否有元素  public IWebElement getDivContactModule()        {            return driver.FindElements(By.Id("contactInfo")).Count > 0 ? driver.FindElement(By.Id("contactInfo")) : null;        } passengerInfo.getLblTotalAmount().Text.ToString().Trim().TrimStart('¥');获取时间now_time = DataTime.Now获取明天tomorrow = DataTime.Now.AddDay(1)昨天yestaday = DataTime.Now.AddDay(-1) Xml requestXML = new Xml(requestStr); requestXML.SetElementValueByXpath("//FlightInfos/FlightInfo[1]/EffectDate", string.Format("{0}T00:00:00", DateTime.Today.AddDays(5).ToString("yyyy-MM-dd")));操作键盘TAB键在selenium中隐藏元素由于属性是隐藏的,如果直接对隐藏属性进行操作会抛出异常所以如果需要对隐藏元素,必须首先使隐藏元素弹出,此时元素的隐藏属性会失去需要注意的时,实际在selenium中弹出隐藏元素,并非模拟操作那样鼠标点击就可以,必须要通过其他方式,如:使用TAB键从上一元素顺序切换到“出发城市”元素框上;或者通过对“出发城市”这个元素使用sendkey”\n”也可以弹出隐藏元素

 //操作键盘TAB键

Actions enter = new Actions(driver);

enter.SendKeys(Keys.Tab).Perform();

如何等待页面元素加载完成
(1)明确等待

driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMinutes(5));
(2)隐形等待

如何得到弹出窗口
(1)当前窗口的句柄
    driver.CurrentWindowHandle
(2)所有窗口的句柄
    driver.WindowHandles
(3)根据句柄得到窗口
    if driver.CurrentWindowHandle=driver.WindowHandles[i]
    IWebDriver window=driver.SwitchTo().Window(driver.WindowHandles[i])
(4)根据窗口得到title,url
    window.Title
    window.Url
如何操作cookie
(1)增加一个name = "name",value="value"的cookie
    Cookie cookie=new Cookie("name","value");
        driver.Manage().Cookies.AddCookie(cookie);
(2)得到页面下所有的cookies,输入它的所在域、name、value、有效日期、路径
    ICookieJar cookies=driver.Manage().Cookies;
        Cookie co = cookies.GetCookieNamed("name");
        Console.WriteLine(co.Domain);
        Console.WriteLine(co.Name);
        Console.WriteLine(co.Value);
        Console.WriteLine(co.Expiry);
        Console.WriteLine(co.Path);
(3)删除cookie三种方法
    a)通过cookie的name
    driver.Manage().Cookies.DeleteCookieNamed("CookieName");
    b)通过cookie对象
    driver.Manage().Cookies.DeleteCookie(cookie);
    c)全部删除
    driver.Manage().Cookies.DeleteAllCookies();
如何利用Selenium-webdriver截图
        Screenshot screenShotFile = ((ITakesScreenshot)driver).GetScreenshot();
        screenShotFile.SaveAsFile("test",ImageFormat.Jpeg);
如何取得table中的内容
 (1)通过行得到列的方法
    private IWebElement GetCell(IWebElement row,int cell)
        {
            IList<IWebElement> cells;
            IWebElement target = null;
            //列里面有"<th>"、"<td>"两种标签,所以分开处理
            if(row.FindElements(By.TagName("th")).Count>0)
            {
                cells = row.FindElements(By.TagName("th"));
                target = cells[cell];
            }

            if(row.FindElements(By.TagName("td")).Count>0)
            {
                cells = row.FindElements(By.TagName("td"));
                target = cells[cell];
            }
            return target;
        }
(2)通过By得到行的方法
    public String GetCellText(By by,String tableCellAddress)
        {
            //得到table元素
            IWebElement table = driver.FindElement(by);
            //对所要查找的单元格位置字符进行分解,得到对应的行、列
            int index = tableCellAddress.Trim().IndexOf('.');
            int row = Convert.ToInt32(tableCellAddress.Substring(0, index));
            int cell = Convert.ToInt32(tableCellAddress.Substring(index + 1));
            //得到table表中所有行对象,并得到所要查询的行对象
            IList<IWebElement> rows = table.FindElements(By.TagName("tr"));
            IWebElement theRow = rows[row];
            return GetCell(theRow, cell).Text;
        }
(3)通过参数得到对应行列的内容
    Console.WriteLine(GetCellText(By.Id("mytable"),"0.2")); //得到id="mytable"中的第一行第三列的表格内容

多选项(checkbox)

多选项的操作和单选的差不多:

WebElement checkbox = driver.findElement(By.id("myCheckbox."));

checkbox.click();

checkbox.clear();

checkbox.isSelected();

checkbox.isEnabled();