快乐学习
前程无忧、中华英才非你莫属!

Selenium各种常用Action详解-Day2

1、Html5标签处理

 

对js.executeScript(“arguments[0].pause()”, vedio),executeScript方法接收了两个参数,这个方法会根据第二个参数,来执行第一个参数中的语句,方法整体会根据vedio这个参数找到相关的对象(有的不止一个),然后执行选取第一个对象进行pasue()操作,arguments[0]表示众多vedio对象中的第一个,因为这个方法在查找vedio的时候返回值是list类型,即使返回的vedio只有一个,也必须按照arguments[0]这种写法。

 

 

Canvas标签 

 

<canvas>是html5提供的一套画图标签, 找到canvas元素之后就可以对画布进行画图操作了,代码如下:

WebDriver driver = new FirefoxDriver();
driver.get("http://literallycanvas.com/";);
pause(2000);
//找到canvas元素
WebElement canvas = driver.findElement(By.xpath("//*[@id=&apos;literally-canvas&apos;]//canvas[1]"));
//声明一个操作类
Actions drawPen = new Actions(driver);
//点击并保持不放鼠标 ,按照给定的坐标点移动
drawPen.clickAndHold(canvas).moveByOffset(20, 100).moveByOffset(100, 20).moveByOffset(-20, -100).moveByOffset(-100, -20).release().perform();
pause(2000);
driver.quit();

 

 

目前HTML5技术已经渐渐成为了主流,主流的浏览器都已支持HTML5。越来越多的应用使用了HTML5的元素,如 canvas,video 等,另外网页存储功能更增加了用户的网络体验,使得越来越多的开发者在使用这样的标准,所以我们也需要学习如何使用自动化技术来测试它们.

 

JavaScript 函数有个内置的对象叫作arguments。argument对象包含了函数调用的参数数组,[0]表示取对象的第1个值。

currentSrc 熟悉返回当前音频/视频的 URL。如果未设置音频/视频,则返回空字符串。

load()、play()、pause() 等控制着视频的加载、播放和暂停。

 

 

 

 

2、多表单切换

//先通过xpth定位到iframe
WebElement xf = driver.findElement(By.xpath("//iframe[@id=&apos;if&apos;]"));
driver.switchTo().frame(xf);
……
//退回上一级表单
driver.switchTo().defaultContent();
如果完成了在当前表单上的操作,则可以通过switchTo().defaultContent()方法跳出表单。

 

3、多窗口切换

 

 

例中所涉及的新方法如下:

getWindowHandle():获得当前窗口句柄。

getWindowHandles():返回的所有窗口的句柄到当前会话。

switchTo().window():用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。

 

 

 

 

 

4、 警告框处理

 

 

在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to_alert()方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ sendKeys等方法进行操作。

·getText():返回 alert/confirm/prompt 中的文字信息。

·accept(): 接受现有警告框。

·dismiss():解散现有警告框。

·sendKeys(keysToSend):    发送文本至警告框。keysToSend:将文本发送至警告框。

 

 

5、文件上传

 

 

对于Web页面的上传功能实现一般有以下两种方式。

普通上传:普通的附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器。

插件上传:一般是指基于Flash、JavaScript或Ajax等技术所实现的上传功能。

 

 

普通上传:普通的附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器。

插件上传:一般是指基于Flash、JavaScript或Ajax等技术所实现的上传功能。

 

 

sendKeys实现上传

 

对于通过input标签实现的上传功能,可以将其看作一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传。

 

 

 

//定位上传按钮

 

driver.findElement(By.name(“file”)).sendkes(“具体要上传文件的路径”)

 

 

如果能找到上传的input标签,那么基本上就可以通过sendKeys()方法向其输入一个文件地址来实现上传。

 

 

AutoIt实现上传

 

 

从网站上下载AutoIt并安装,安装完成后,在菜单中会看到如图4.15所示的Auto Lt菜单

AutoIt Windows Info:    用于识别Windows控件信息。

Compile Script to.exe:   用于将AutoIt生成 exe 执行文件。

Run Script:            用于执行AutoIt脚本。

SciTE Script Editor:     用于编写AutoIt脚本。

下面以操作upload.html上传弹出的窗口为例,讲解AutoIt上传过程。

1、首先打开AutoIt Windows Info 工具,用鼠标单击Finder Tool,鼠标将变成一个小风扇形状的图标,如图4.16所示。按住鼠标左键,将其拖动到需要识别的控件上(如“打开”按钮控件)。

 

巴拉,巴拉写好之后~

 

 

Runtime .getRuntime().exe(“autoIT打包好的可操作程序”);

 

 

 

非标准控件,使用java.awt.Robot键盘处理。回车、Tab、粘贴等。

 

 

 

// 模拟键盘回车事件 

public void KeyEventEnter() throws AWTException { Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_ENTER); }

 

 

 

// 复制变量值到剪贴板,并粘贴 

public void KeyEventClipboard(String str) throws AWTException {
    Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    Transferable t = new StringSelection(str); 
    cb.setContents(t, null); 
    Robot robot = new Robot(); 
    robot.keyPress(KeyEvent.VK_CONTROL); 
    robot.keyPress(KeyEvent.VK_V); 
    robot.keyRelease(KeyEvent.VK_V); 
    robot.keyRelease(KeyEvent.VK_CONTROL); }

 

 

 

6、下载文件

 

//自动化下载某个文件

import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;

public class DownloadFiles {
    public static String DownloadFilepath = "D:\DownloadFiles";
    WebDriver driver;
    String url;
    JavascriptExecutor js;
  @Test
  public void test() throws Exception
  {
      driver = new FirefoxDriver(FilefoxDriverProfile());
      driver.get(url);
      driver.findElement(By.partialLinkText("Stub")).click();
      
      try
      {
          Thread.sleep(3000);
      }catch(Exception e){
          e.printStackTrace();
      }
  }
  
  @BeforeMethod
  public void beforeMethod()
  {
      url="http://ftp.mozilla.org/pub/firefox/releases/35.0b8/win32/zh-CN/";
  }

  @AfterMethod
  public void afterMethod()
  {
      driver.quit();
  }
  
  public static FirefoxProfile FilefoxDriverProfile () throws Exception
  {
      //声明一个profile对象
      FirefoxProfile profile = new FirefoxProfile();
      profile.setPreference("browser.download.folderList",2);
      profile.setPreference("browser.download.manager.showWhenStarting", false);
      profile.setPreference("browser.download.dir", DownloadFilepath);
      profile.setPreference("browser.helperApps.neverAsk.openFile",
              "application/xhtml+xml,application/xml,application/x-msdownload,application/octet/octet-stream,application/exe,txt/csv,application/pdf,application/x-msexcl,application/x-excel,application/excel,image/png,image/jpeg,text/html,text/plain,text/x-c");
      profile.setPreference("browser.helperApps.neverAsk.saveToDisk",
              "application/xhtml+xml,application/xml,application/x-msdownload,application/octet/octet-stream,application/exe,txt/csv,application/pdf,application/x-msexcl,application/x-excel,application/excel,image/png,image/jpeg,text/html,text/plain,text/x-c");
      //不会打开未知MIMe类型
      profile.setPreference("browser.helperApps.alwaysAsk.force", false);
      //不会弹出警告框
      profile.setPreference("browser.download.manager.alertOnEXEopen", false);
      profile.setPreference("browser.download.manager.focusWhenStarting", false);
      profile.setPreference("browser.download.manager.useWindow", false);
      profile.setPreference("browser.download.manager.showAlertOnComplete", false);
      profile.setPreference("browser.download.manager.closewhenDone", false);
      return profile;
  }
}

 

 

 

Selenium也不能操作“另存为”这种系统窗口。在这种情况下,我们只能通过脚本调用Wget的方式来实行下载。 

Wget下载路径:https://eternallybored.org/misc/wget/

 

driver.get(baseUrl); //获取下载连接元素 

WebElement downloadButton = driver.findElement(By.id("messenger-download")); 
//获取下载连接URL 
String sourceLocation = downloadButton.getAttribute("href"); 
//拼接Wget下载命令 
String wget_command = "cmd /c C:\Wget\wget.exe -P D: --no-check-certificate " + sourceLocation; 
try { 
//执行命令 
Process exec = Runtime.getRuntime().exec(wget_command); 
int exitVal = exec.waitFor(); 
System.out.println("Exit value: " + exitVal); 
} catch (InterruptedException | IOException ex) 
      { System.out.println(ex.toString()); } //TODO:检查下载是否成功

 

 

 

7、鼠标操作

 

在WebDriver中,将这些关于鼠标操作的方法封装在ActionChains 类提供

Actions 类提供了鼠标操作的常用方法:
· contextClick()    右击
· clickAndHold()   鼠标点击并控制
· doubleClick()    双击
· dragAndDrop()   拖动
· release()        释放鼠标
· perform()  执行所有Actions中存储的行为

 

 

 

8、操作Cookie

 

有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试完成的。WebDriver提供了操作Cookie的相关方法可以读取、添加和删除cookie信息

 

在实际的web应用中,可能会涉及到cookie测试,验证浏览器中的cookie是否正确.。Cookies 验证:如果系统使用了cookie,测试人员需要对它们进行检测。如果在 cookies 中保存了注册信息,请确认该 cookie能够正常工作而且已对这些信息已经加密。如果使用 cookie 来统计次数,需要验证次数累计正确。关于cookie的使用可以参考浏览器的帮助信息。如果使用B/S结构cookies。WebDriver 提供了操作Cookie 的相关方法可以读取、添加和删除cookie 信息等方法。(cookie 数据是以以字典的形式进行存放的)

 

 

(1)getCookies() 获得所有cookie 信息。

(2)getCookieNamed(String name) 返回字典的key 为“name”的cookie 信息。

(3) addCookie(cookie dict) 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。

(4)deleteCookieNamed(String name) 删除cookie 信息。“name”是要删除的cookie 的名称;

(5)“optionsString”是该cookie 的选项,目前支持的选项包括“路径”,“域”。

(6) deleteAllCookies() 删除所有cookie 信息。

 

 

public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
    ChromeOptions Options = new ChromeOptions();
    Options.addArguments("user-data-dir=C:\Users\happy\AppData\Local\Google\Chrome\User Data");
    WebDriver driver = new ChromeDriver(Options);
    driver.manage().window().maximize();
    // 窗口最大化
    driver.get("https://www.baidu.com/");
      Set<Cookie> cookie= driver.manage().getCookies();
    //获取cookie
    System.out.println(cookie);
    //打印cookie
    driver.close();
    driver.quit();
}


public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
        ChromeOptions Options = new ChromeOptions();
        Options.addArguments("user-data-dir=C:\Users\happy\AppData\Local\Google\Chrome\User Data");
        WebDriver driver = new ChromeDriver(Options);
        driver.manage().window().maximize();
        // 窗口最大化
        driver.get("https://www.baidu.com/");
        //添加cookie
        Cookie c1 = new Cookie("name", "key-aaaaaaa");
        Cookie c2 = new Cookie("value", "value-bbbbbb");
        driver.manage().addCookie(c1);
        driver.manage().addCookie(c2);
        // 获得cookie
        Set<Cookie> coo = driver.manage().getCookies();
        System.out.println(coo);
        //删除所有的cookie
        // driver.manage().deleteAllCookies();
        driver.close();
        driver.quit();
    }

 

 

 

那么在什么情况下会用到cookie 的操作呢?例如开发人员开发一个功能,当用户登录后,会将用户的用户名写入浏览器cookie,指定的key 为“username”,那么我们就可以通过getCookies() 找到useranme,打印vlaue。

如果找不到username 或对应的value 为空,那么说明cookie 没有成功的保存到浏览器中。deleteCookie() 和deleteAllCookies() 的使用也很简单,前者通过name 删除一个特定的cookie 信息,后者直接删除浏览器中的所有cookies()信息。

 

9、调用JavaScript

虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。

如何使用JS在selenium webdriver中实现点击按钮的操作?

Webelement button = driver.findelement(by.id(“kw”));
Javascriptexecutor js = (javascriptexecutor) driver;
Js.executeScript(“arguments[0].click();”, element);


如何使用JS刷新浏览器?



Javascriptexecutor js =(javascriptexecutor) driver;

Js.executeScript(“history.go(0)”);


如何在selenium中获取整个网页的innertext?

Javascriptexecutor js =(javascriptexecutor) driver;
String stext = js.executeScript(“returndocument.documentElement.innertext;”).toString;



如何获取网页的标题


Javascriptexecutor js =(javascriptexecutor) driver;

Js.executeScript(“return document.title;”).toString;


如何使用selenium实现鼠标滚动操作
Javascriptexecutor js =(javascriptexecutor) driver;
Js.executeScript(“window.scrollBy(0,50)”);                     //  表示往下滚动50个像素点
js.executeScript(“window.scrollBy(0,document.body.scrollHeight)”);



是和实现点击悬停的菜单?

Javascriptexecutor js =(javascriptexecutor) driver;
Js.executeScript(“$(‘ul.menus.menu-secondary.sf-js-enabled.sub-menuli’).hover()”);



贴个实例供大家参考下,这段代码是用来格式为“readonly”属性的input日期输入元素。

/**
* 日期控件处理,将readonly属性remove掉,input输入框按正常文本输入框处理,输入正确的日期格式数据
*/
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].removeAttribute(&apos;readonly&apos;);", driver.findElement(By.xpath(".//*[@id=&apos;editForm&apos;]/table/tbody/tr[1]/td[2]/span/input[1]")));

 

代码

JavascriptExecutor js = (JavascriptExecutor) driver;

js.executeScript(String script, object… args);

 

第一行代码将driver强制转换为JavascriptExecutor

第二行代码是执行js,参数script是要执行的js语句,可以看到第二个参数在参数类型和参数名之间有…,

在java里,这代表这个参数可以没有,也可以有1个或者多个。对于executeScript这个方法,取决于js语句是否需要参数。该方法返回值Boolean, Long, String, List or WebElement. 或者是 null.

 

示例

JavascriptExecutor js = (JavascriptExecutor) driver;
// 用js弹出alert
js.executeScript("alert(&apos;Test Case Execution Is started Now..&apos;);");
driver.switchTo().alert().accept();
// 用js判断页面加载完毕,返回complete
System.out.println("readyState: "
+ js.executeScript("return document.readyState").toString());
// 用js得到页面的title
String title = (String) js.executeScript("return document.title");
System.out.println("current page title get by js: " + title);
// 用js得到页面的domain name
System.out.println("current page domain name get by js: "
+ js.executeScript("return document.domain"));
// 用js操作页面元素,如高亮显示某个元素
WebElement element = driver.findElement(By.id("kw"));
js.executeScript("arguments[0].setAttribute(&apos;style&apos;, arguments[1]);",
element, "color: orange; border: 4px solid orange;");

/**
* 每隔一秒check一下页面加载是否完成,check次数是25
*/public void checkPageIsReady() {
JavascriptExecutor js = (JavascriptExecutor) driver;
for (int i = 0; i < 25; i++) {
if ("complete".equals(js
.executeScript("return document.readyState").toString())) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

 

 

10、窗口截图

自动化用例是由程序去执行,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数getScreenshotAs()来截取当前窗口。

 

 

11、记录cookie 绕过验证码

 

通过向浏览器中添加cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。例如我们在第一次登录某网站时勾选“记住密码”的选项,当下次再访问该网站时自动就处于登录状态了。这样自然就绕过了验证码问题。那么这个“记住密码”的功能其实就记录在了浏览器的cookie中。前面已经学了通过WebDriver来操作浏览器的cookie,可以通过add_cookie()方法将用户名密码写入浏览器cookie ,当再次访问网站时,服务器将直接读取浏览器cookie登录。

 

12、嵌套IFrame处理

 

      static WebDriver driver;
      public  static int findFrameNumber(WebDriver driver,By by){      
            int i;
            
            int framecount = driver.findElements(By.tagName("iframe")).size();
            
            for (i = 0; i < framecount; i++) {          
                  driver.switchTo().frame(i);  
                  int count = driver.findElements(by).size();                     
                  if(count>0){ driver.findElement(by).click();
                        break;
                  }
                  else{System.out.println("继续寻找");     }
            }
            return i;      
      }
   public static void main(String[] args) {
            int number =findFrameNumber(driver,By.xpath("xxx"));
            driver.switchTo().frame(number);
            
      }

      

 

13、窗口设置

 

指定设置窗口大小

首先要给点你要设置窗口的宽度和高度

//设置窗口的 宽度为:800,高度为600

Dimension d = new Dimension(800, 600);
然后去执行这个设置:
driver.manage().window().setSize(d);

 

指定窗口在屏幕中出现位置

先确定浏览器在屏幕出现的坐标

//设置窗口出现在屏幕上的坐标

Point p = new Point(500, 300);

//执行设置

driver.manage().window().setPosition(p);

 

14、下拉列表(select)

 

我们先要定位这个Select下拉框(元素)
WebElement element_province = driver.findElement(By.id(“province”));
然后把element传入Select
Select province = new Select(element_province);
然后由Select来操作下拉框
province.selectByIndex(0) //根据所选值的位置来选择下拉框值,从0开始
province.selectByValue(“18”) //根据value值来选择下拉框的值,比如这里的18,选择的就是海南
province .selectByVisibleText(“北京”)//这个是根据可见文本来操作下拉菜单,比如你选的北京,那么就会找到北京作为下拉框的值。

 

 

 

15、处理Alert(弹出层)

 

 

selenium提供一个Alert的API专门获取Alert.使用方法为:

Alert  a =  driver.switchTo().alert();此方法可以获取当前页面弹出的alert。

获取到alert以后,我们可以通过alert提供的方法来获取alert上的文本,模拟点击alert上的确定按钮,模拟点击alert上的取消按钮等。

获取alert文本方法:a.getText();

模拟点击确定按钮:a.accept();

模拟点击取消按钮:a.dismiss();

 

 

16、等待

 

 

硬性等待:Thread.sleep(int sleeptime);

 

智能等待    :

public void waitForElementToLoad(int timeOut, final By By) { 
 try {
 (new WebDriverWait(driver, timeOut)).until(new ExpectedCondition<Boolean>() {
 public Boolean apply(WebDriver driver) {
 WebElement element = driver.findElement(By);
 return element.isDisplayed();
 }
 });
 } catch (TimeoutException e) {
 Assert.fail("超时!! " + timeOut + " 秒之后还没找到元素 [" + By + "]",e);
 }
}

 

此方法有两个参数,timeOut是等待元素的超时时间,就是说过了这个时间如果元素还没加载出来就报错。By对象,这个是你元素的定位方式比如By.id(“login”);这个方法会在给定timeOut去查找元素,如果在小于timeOut的时间内找到了元素,剩下的时间不在等待,直接执行接下来的操作。

 

设置等待页面加载完毕

 

有时候我们打开一个网页,网页加载速度比较慢,我们又想等网页完全加载完毕了在执行操作,该怎么办?

int pageLoadTime = 10;

driver.manage().timeouts().pageLoadTimeout(pageLoadTime, TimeUnit.SECONDS);

这段代码,加载driver.get(url)方法之前,他们等待你给定的时间,如果在给定时间内网页还是没有加载出来就会报错,如果在小于给定时间内加载完毕了,剩下的时间不再等待。

 

 

 

17、PageObject模式

 

 使用webdriver做过一段时间的测试就会发现一个对某一个页面的元素进行定位的时候,程序行间充斥着id()name()xpath()等方法,这样会造成测试程序的可读性较差,不便于后期的维护以及修改。

 

 

Page Object将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。页面,操作分离。可读性,可维护性大大增强。

public class test_01 {
public static WebDriver driver =null;
@BeforeClass
public void beforeClass() {
System.out.println("Begin");
}
@Test
public  void chooseSeat() throws InterruptedException{
System.setProperty("webdriver.chrome.driver", "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe");
driver = new ChromeDriver();
loginPage m =PageFactory.initElements(driver,loginPage.class);
driver.get("http://trains.ctrip.com/TrainBooking/SearchTrain.aspx###");
m.Search(driver,"上海");
}
@AfterClass
public void afterClass() {
System.out.println("end ");
}
}     
}
}





public class loginPage {
//通过id查找元素
@FindBy(id="notice01")
private WebElement username;
public  static WebElement element = null;
public static WebDriver driver =null;
public loginPage(WebDriver driver){
this.driver =driver;
}
public void  Search(WebDriver driver,String leave){
this.username.sendKeys(leave);
}
}

 

 

部分内容来源于网络,由于操之过急,记不住原始URL!带来不便,敬请谅解!

 

 

 

 

打赏

未经允许不得转载:同乐学堂 » Selenium各种常用Action详解-Day2

分享到:更多 ()

评论 6

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #6

    Very nice post. I just stumbled upon your weblog and wanted to say that I’ve really enjoyed surfing around your blog posts.
    In any case I’ll be subscribing to your feed and I hope you write again soon!

    yupoo gucci slides2年前 (2018-05-20)回复
  2. #5

    Hello, i think that i saw you visited my website thus i came
    to “return the favor”.I am trying to find things to
    improve my site!I suppose its ok to use a few of your ideas!!

    Dadu Koprok2年前 (2018-06-11)回复
  3. #4

    If you’re similar to most consumers today, any time you check out get a new Brother cartridge, you inevitably consider, “Why do Brother cartridges cost so much”.
    Often referred to as a plain, these units
    can be bought by third-party manufacturers and so are designed with existing materials under
    a range of various brand names. There are a lot of problems that
    may occur along with your Brother printer and when basic troubleshooting doesn’t
    correct the problem, then a likely fix is always to update the driver.

  4. #3

    I’ve been browsing online more than 2 hours today, yet I never found any interesting article like yours.
    It is pretty worth enough for me. In my view, if all web owners and bloggers made
    good content as you did, the net will be a lot more useful
    than ever before.|
    I couldn’t refrain from commenting. Well written!|
    I’ll right away seize your rss feed as I can’t to find your e-mail subscription link
    or e-newsletter service. Do you’ve any? Please allow me realize in order that I
    may subscribe. Thanks.|
    It is the best time to make some plans for the future and
    it’s time to be happy. I’ve read this post and if I could I wish to suggest
    you few interesting things or suggestions. Perhaps you could write next articles referring to this article.
    I desire to read more things about it!|
    It’s the best time to make some plans for the long run and
    it’s time to be happy. I’ve learn this publish and if I may I want to recommend you some
    interesting issues or advice. Maybe you could write subsequent articles regarding
    this article. I want to read more issues approximately it!|
    I’ve been browsing online more than three hours nowadays, yet
    I never discovered any fascinating article like yours. It
    is lovely worth sufficient for me. Personally, if all website owners and bloggers made excellent content as you did, the internet shall
    be a lot more helpful than ever before.|
    Ahaa, its pleasant dialogue about this paragraph here at this web
    site, I have read all that, so now me also commenting here.|
    I am sure this piece of writing has touched all the internet users, its really really pleasant piece of writing on building up new webpage.|
    Wow, this paragraph is good, my sister is analyzing these kinds of things, thus
    I am going to let know her.|
    bookmarked!!, I like your blog!|
    Way cool! Some very valid points! I appreciate
    you penning this article and also the rest of the site is really good.|
    Hi, I do believe this is a great site. I stumbledupon it 😉 I may revisit yet again since i have saved as a
    favorite it. Money and freedom is the best way to change, may you be rich
    and continue to help other people.|
    Woah! I’m really loving the template/theme of this blog.

    It’s simple, yet effective. A lot of times it’s very hard to get that
    “perfect balance” between superb usability and appearance.
    I must say you have done a superb job with this. In addition, the
    blog loads very quick for me on Chrome. Superb Blog!|
    These are actually fantastic ideas in concerning blogging.
    You have touched some pleasant points here.
    Any way keep up wrinting.|
    I enjoy what you guys are up too. This sort of clever work and reporting!
    Keep up the wonderful works guys I’ve added you guys to blogroll.|
    Hey there! Someone in my Facebook group shared this website with us so I
    came to check it out. I’m definitely loving the information.
    I’m book-marking and will be tweeting this to my followers!
    Terrific blog and amazing style and design.|
    I enjoy what you guys are up too. This sort of
    clever work and coverage! Keep up the very good works guys I’ve incorporated you guys to
    my blogroll.|
    Howdy would you mind stating which blog platform you’re working with?
    I’m going to start my own blog soon but I’m having
    a tough time making a decision between BlogEngine/Wordpress/B2evolution and
    Drupal. The reason I ask is because your design seems different then most blogs and
    I’m looking for something completely unique. P.S Apologies for being
    off-topic but I had to ask!|
    Hi there would you mind letting me know which web host you’re
    using? I’ve loaded your blog in 3 different internet browsers and I
    must say this blog loads a lot quicker then most.
    Can you recommend a good hosting provider at
    a honest price? Thanks, I appreciate it!|
    I love it when folks get together and share thoughts. Great
    website, keep it up!|
    Thank you for the auspicious writeup. It in fact was a amusement account it.
    Look advanced to far added agreeable from you! However,
    how could we communicate?|
    Hello just wanted to give you a quick heads up.
    The words in your article seem to be running off
    the screen in Firefox. I’m not sure if this is a formatting issue or something to do with browser compatibility but I thought I’d
    post to let you know. The style and design look great though!
    Hope you get the issue solved soon. Cheers|
    This is a topic that is near to my heart… Best wishes!
    Exactly where are your contact details though?|
    It’s very effortless to find out any matter on net as compared to books, as I found this piece of writing
    at this website.|
    Does your site have a contact page? I’m having
    problems locating it but, I’d like to send you an e-mail.
    I’ve got some ideas for your blog you might be interested in hearing.

    Either way, great website and I look forward to seeing it improve over time.|
    Hola! I’ve been following your weblog for some time now and finally got the courage
    to go ahead and give you a shout out from Humble Tx!
    Just wanted to tell you keep up the good work!|
    Greetings from Florida! I’m bored to tears at work so I decided to
    check out your website on my iphone during lunch break.
    I really like the info you present here and can’t wait to take a look
    when I get home. I’m shocked at how quick your blog loaded on my phone ..
    I’m not even using WIFI, just 3G .. Anyways, fantastic site!|
    Its like you read my thoughts! You appear to grasp a lot approximately this, such as
    you wrote the e-book in it or something. I believe that you can do with a few percent to force the message home
    a little bit, but other than that, that is fantastic blog.

    A fantastic read. I’ll definitely be back.|
    I visited several blogs except the audio feature for audio
    songs present at this web site is in fact wonderful.|
    Hi, i read your blog occasionally and i own a similar
    one and i was just curious if you get a lot of spam responses?
    If so how do you reduce it, any plugin or anything you can recommend?
    I get so much lately it’s driving me mad so any help is
    very much appreciated.|
    Greetings! Very helpful advice within this post!

    It’s the little changes that will make the most significant changes.
    Many thanks for sharing!|
    I absolutely love your blog.. Great colors & theme.
    Did you create this website yourself? Please reply back as
    I’m hoping to create my very own blog and would love to know where you got this from or what
    the theme is called. Thanks!|
    Howdy! This article couldn’t be written any better! Going
    through this post reminds me of my previous roommate!
    He continually kept preaching about this. I most certainly will forward this
    information to him. Pretty sure he will have a good read.
    Many thanks for sharing!|
    Wow! This blog looks exactly like my old one! It’s on a entirely different subject but it has pretty much the same layout and design. Outstanding choice of colors!|
    There’s definately a lot to find out about this topic. I love all
    of the points you made.|
    You’ve made some decent points there. I checked on the internet
    to learn more about the issue and found most people will go
    along with your views on this website.|
    Hello, I check your new stuff regularly. Your humoristic style is witty, keep up the good
    work!|
    I simply could not depart your site before suggesting that I
    extremely loved the usual information a person supply for your visitors?
    Is gonna be again frequently in order to inspect new posts|
    I needed to thank you for this fantastic read!! I absolutely loved every bit of it.
    I’ve got you book-marked to check out new things you post…|
    What’s up, just wanted to say, I loved this blog post.
    It was helpful. Keep on posting!|
    Hello, I enjoy reading through your article. I wanted to write a little comment to support
    you.|
    I always spent my half an hour to read this website’s
    posts everyday along with a mug of coffee.|
    I for all time emailed this weblog post page
    to all my associates, since if like to read it afterward
    my contacts will too.|
    My programmer is trying to persuade me to move to .net from PHP.
    I have always disliked the idea because of the
    costs. But he’s tryiong none the less. I’ve been using Movable-type on numerous websites
    for about a year and am nervous about switching to another
    platform. I have heard fantastic things about blogengine.net.
    Is there a way I can transfer all my wordpress posts into
    it? Any kind of help would be greatly appreciated!|
    Hi there! I could have sworn I’ve visited your blog before
    but after looking at many of the articles I realized it’s new to me.
    Anyhow, I’m definitely delighted I discovered it and I’ll be
    bookmarking it and checking back regularly!|
    Terrific work! That is the kind of info that should be shared around
    the net. Shame on the seek engines for no longer positioning this
    publish upper! Come on over and seek advice from my website .
    Thank you =)|
    Heya i am for the first time here. I came across this board and I find It really useful & it
    helped me out much. I hope to give something back and help others like you
    helped me.|
    Hello, I do believe your website could be having browser compatibility problems.
    When I take a look at your site in Safari, it looks fine however, when opening in IE, it’s got some overlapping issues.

    I just wanted to give you a quick heads up! Aside from that, great website!|
    Someone essentially help to make significantly posts I
    might state. That is the first time I frequented your web
    page and thus far? I surprised with the research you made to make this actual post extraordinary.
    Great job!|
    Heya i am for the primary time here. I came across this board and I find It truly helpful & it helped me out much.
    I’m hoping to give something back and help others like you helped me.|
    Hey there! I just wish to give you a huge thumbs up for the great
    info you have right here on this post. I will be returning
    to your site for more soon.|
    I all the time used to study post in news papers but now as I am a user of internet
    therefore from now I am using net for articles, thanks to web.|
    Your way of telling everything in this article is genuinely good,
    every one be able to without difficulty understand it, Thanks a lot.|
    Hi there, I found your site via Google even as searching for a related subject, your site came
    up, it seems to be great. I’ve bookmarked it in my google bookmarks.

    Hi there, simply became aware of your blog thru
    Google, and located that it’s really informative.
    I am going to be careful for brussels. I’ll appreciate when you proceed this in future.
    Many people shall be benefited from your writing. Cheers!|
    I’m curious to find out what blog platform you have been using?
    I’m having some minor security problems with my latest site and I’d like to find something more secure.
    Do you have any recommendations?|
    I’m extremely impressed with your writing skills
    as well as with the layout on your weblog. Is this a paid
    theme or did you customize it yourself? Anyway keep up
    the excellent quality writing, it’s rare to see
    a great blog like this one these days.|
    I’m really inspired together with your writing abilities
    and also with the structure to your weblog.

    Is that this a paid subject or did you modify it yourself?
    Either way stay up the nice quality writing, it is rare to look a nice weblog like this one these days..|
    Hello, Neat post. There is a problem together with your
    website in web explorer, could test this? IE nonetheless is the marketplace chief
    and a good component of other folks will omit your wonderful writing because of
    this problem.|
    I am not sure where you’re getting your info, but great
    topic. I needs to spend some time learning much more
    or understanding more. Thanks for wonderful
    information I was looking for this info for my mission.|
    Hi, i think that i saw you visited my blog thus i came to “return the favor”.I am trying to find things to improve my website!I suppose its ok to use a few of \

    When We Rise Season2年前 (2018-09-05)回复
  5. #2

    Yes! Finally something about gamefly free trial.

    gamefly free trial1年前 (2019-05-20)回复
  6. #1

    Very nice post. I just stumbled upon your blog and
    wished to say that I’ve truly enjoyed surfing around your blog posts.
    After all I’ll be subscribing to your rss feed and I hope
    you write again very soon!

特别的技术,给特别的你!

联系QQ:1071235258QQ群:226134712
error: Sorry,暂时内容不可复制!