当前位置: 首页 > news >正文

比较多人用什么网站做推广济南新闻头条最新事件

比较多人用什么网站做推广,济南新闻头条最新事件,河海大学学风建设网站,大题小做网站本文将继续上文对WebDriver API的功能使用进行介绍。 一、浏览器操作 1. 浏览器前进forward与后退back 浏览器前进操作是指导航到前一个页面,在浏览器的历史记录中向前移动一页。 浏览器后退操作是指导航到前一个页面,在浏览器的历史记录中向后移动一…

本文将继续上文对WebDriver API的功能使用进行介绍。

一、浏览器操作

1. 浏览器前进forward与后退back

浏览器前进操作是指导航到前一个页面,在浏览器的历史记录中向前移动一页。

浏览器后退操作是指导航到前一个页面,在浏览器的历史记录中向后移动一页。

示例代码:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class BrowserNavigation {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开第一个网页driver.get("https://www.example.com");// 打开第二个网页driver.get("https://www.google.com");// 执行后退操作,返回到第一个网页driver.navigate().back();// 执行前进操作,返回到第二个网页driver.navigate().forward();// 关闭浏览器driver.quit();}
}

2. 操作滚动条

操作滚动条通常使用JavaScript执行,因为Selenium WebDriver没有直接的方法来操作滚动条。以下是滚动到页面底部、滚动到特定元素和滚动到页面顶部的示例。

示例代码:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;public class ScrollExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开一个网页driver.get("https://www.example.com");// 创建一个JavaScript执行器JavascriptExecutor js = (JavascriptExecutor) driver;// 滚动到页面底部js.executeScript("window.scrollTo(0, document.body.scrollHeight);");// 滚动到特定元素WebElement element = driver.findElement(By.id("someElementId"));js.executeScript("arguments[0].scrollIntoView(true);", element);// 滚动到页面顶部js.executeScript("window.scrollTo(0, 0);");// 关闭浏览器driver.quit();}
}

解释

  • 滚动条

    • window.scrollTo(0, document.body.scrollHeight);:滚动到页面底部。
    • arguments[0].scrollIntoView(true);:滚动到指定元素的位置。
    • window.scrollTo(0, 0);:滚动到页面顶部。

二、sendKey模拟按键操作

在Selenium WebDriver中,sendKeys 方法不仅可以用于输入文本,还可以用于模拟按键操作。Selenium 提供了一个 Keys 枚举类,其中包含了许多常见的键,如箭头键、功能键、回车键等。

常见按键及其对应的 Keys 枚举值

按键Keys 枚举值
回车键Keys.ENTER
空格键Keys.SPACE
退格键Keys.BACK_SPACE
删除键Keys.DELETE
选项键Keys.ALT
控制键Keys.CONTROL
转移键Keys.SHIFT
箭头上键Keys.ARROW_UP
箭头下键Keys.ARROW_DOWN
箭头左键Keys.ARROW_LEFT
箭头右键Keys.ARROW_RIGHT
Tab 键Keys.TAB
ESC 键Keys.ESCAPE
F1-F12 键Keys.F1Keys.F12

示例代码

以下是一些使用 sendKeys 方法来调用按键的示例:

1. 输入文本并按回车键

WebElement searchBox = driver.findElement(By.name("q")); 
searchBox.sendKeys("Selenium WebDriver"); searchBox.sendKeys(Keys.ENTER);
  • 作用:向名为 "q" 的输入框输入 "Selenium WebDriver" 后,模拟按下回车键。

2. 使用 Tab 键导航到下一个元素

WebElement input1 = driver.findElement(By.name("input1")); 
WebElement input2 = driver.findElement(By.name("input2"));
input1.sendKeys("First input"); 
input1.sendKeys(Keys.TAB); // 模拟按下Tab键,焦点将移动到下一个输入框 
input2.sendKeys("Second input");
  • 作用:在第一个输入框输入 "First input" 后,按下 Tab 键,将焦点移动到下一个输入框,然后输入 "Second input"。

3. 组合按键操作(例如复制和粘贴)

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys("Text to be copied"); 
inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本 
inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本 
inputField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本
  • 作用:在输入框中输入文本 "Text to be copied",然后使用组合键 Ctrl+A 选中所有文本,Ctrl+C 复制文本,最后使用 Ctrl+V 粘贴文本。

4. 使用箭头键进行导航

WebElement dropDown = driver.findElement(By.id("dropdown")); 
dropDown.click(); // 打开下拉菜单 
dropDown.sendKeys(Keys.ARROW_DOWN); // 模拟按下箭头下键 
dropDown.sendKeys(Keys.ARROW_DOWN); // 再次按下箭头下键 
dropDown.sendKeys(Keys.ENTER); // 选择当前选项
  • 作用:点击下拉菜单,使用箭头下键两次选择第三个选项,并按下回车键确认选择。

在Selenium WebDriver中,可以使用 sendKeys 方法和 Keys 枚举来模拟键盘组合键操作,如 Ctrl+C、Ctrl+V、Ctrl+A 等。组合键通常用于选择、复制、粘贴等操作。以下是一些常见的键盘组合键及其示例代码。

常见键盘组合键

操作组合键
全选Keys.CONTROL + "a"
复制Keys.CONTROL + "c"
粘贴Keys.CONTROL + "v"
剪切Keys.CONTROL + "x"
撤销Keys.CONTROL + "z"
重做Keys.CONTROL + "y"
新建窗口Keys.CONTROL + "n"
打开新标签Keys.CONTROL + "t"
关闭当前标签Keys.CONTROL + "w"
查找Keys.CONTROL + "f"
保存Keys.CONTROL + "s"
打开浏览器开发工具Keys.CONTROL + Keys.SHIFT + "i"

示例代码

1. 组合键 Ctrl+A 全选

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys("Text to be selected"); 
inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本

2. 组合键 Ctrl+C 复制

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys("Text to be copied"); 
inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本 
inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本

3. 组合键 Ctrl+V 粘贴

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本

4. 组合键 Ctrl+A, Ctrl+C, Ctrl+V 组合操作

WebElement inputField1 = driver.findElement(By.name("input1")); 
WebElement inputField2 = driver.findElement(By.name("input2")); 
inputField1.sendKeys("Text to be copied"); 
inputField1.sendKeys(Keys.CONTROL + "a"); // 全选文本 
inputField1.sendKeys(Keys.CONTROL + "c"); // 复制文本 
inputField2.sendKeys(Keys.CONTROL + "v"); // 粘贴文本到第二个输入框

5. 组合键 Ctrl+F 查找

driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL + "f");

使用 Actions 类进行更复杂的组合键操作

对于一些更复杂的键盘操作,可以使用 Actions 类来实现。

示例:使用 Actions 类执行 Ctrl+A 和 Ctrl+C

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;public class KeyboardCombinationExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开一个网页driver.get("https://www.example.com");// 找到输入框并输入文本WebElement inputField = driver.findElement(By.name("input"));inputField.sendKeys("Text to be copied");// 使用Actions类执行组合键Ctrl+A(全选)和Ctrl+C(复制)Actions actions = new Actions(driver);actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();actions.keyDown(Keys.CONTROL).sendKeys("c").keyUp(Keys.CONTROL).perform();// 关闭浏览器driver.quit();}
}

三、通过Action类模拟鼠标动作

在Selenium中,鼠标事件是通过Actions类来实现的。这个类提供了模拟各种鼠标动作的方法,例如点击、双击、右键点击、拖放等。下面是一些常用的鼠标事件及其对应的方法:

  1. 点击(Click)

    • 单击(Click): 使用click()方法。
    • 双击(Double Click): 使用doubleClick()方法。
    • 右键点击(Context Click): 使用contextClick()方法。
  2. 移动(Move)

    • 移动到元素(Move to Element): 使用moveToElement(WebElement target)方法,可以将鼠标移动到指定的元素上。
    • 移动并点击(Move to Element and Click): 结合moveToElement()click()方法,可以移动到元素并进行点击。
  3. 拖放(Drag and Drop)

    • 直接拖放(Drag and Drop): 使用dragAndDrop(WebElement source, WebElement target)方法,将元素从一个位置拖到另一个位置。
    • 拖放到偏移位置0t): 使用dragAndDropBy(WebElement source, int xOffset, int yOffset)方法,将元素拖放到指定的偏移位置。
  4. 点击并保持(Click and Hold)

    • 点击并保持(Click and Hold): 使用clickAndHold()方法,在指定元素上点击并保持鼠标按钮不放。
    • 释放(Release): 使用release()方法,释放鼠标按钮。

下面是一个示例代码,演示如何使用Actions类来执行这些鼠标事件:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;public class MouseActionsExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开一个网站driver.get("https://example.com");// 创建Actions实例Actions actions = new Actions(driver);// 定位元素WebElement element = driver.findElement(By.id("elementId"));// 单击元素actions.click(element).perform();// 双击元素actions.doubleClick(element).perform();// 右键点击元素actions.contextClick(element).perform();// 移动到元素并点击actions.moveToElement(element).click().perform();// 拖放元素WebElement source = driver.findElement(By.id("sourceElementId"));WebElement target = driver.findElement(By.id("targetElementId"));actions.dragAndDrop(source, target).perform();// 拖放到偏移位置actions.dragAndDropBy(source, 100, 50).perform();// 点击并保持,然后释放actions.clickAndHold(element).release().perform();// 关闭浏览器driver.quit();}
}

perform()方法是一个触发器,用来执行之前定义的所有动作。

四、打印信息

在Selenium中,可以获取并打印许多关于当前网页的信息,如页面标题(title)、当前URL、页面源码、页面的Cookie等。

示例代码

下面是一个综合示例,演示了如何获取并打印这些信息:

import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.util.Set;public class WebPageInfo {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开一个网站driver.get("https://example.com");// 获取并打印页面标题String title = driver.getTitle();System.out.println("Page Title: " + title);// 获取并打印当前URLString currentUrl = driver.getCurrentUrl();System.out.println("Current URL: " + currentUrl);// 获取并打印页面源码String pageSource = driver.getPageSource();System.out.println("Page Source: " + pageSource);// 获取并打印页面的CookieSet<Cookie> cookies = driver.manage().getCookies();for (Cookie cookie : cookies) {System.out.println("Cookie: " + cookie);}// 获取并打印特定元素的文本WebElement element = driver.findElement(By.id("elementId"));String elementText = element.getText();System.out.println("Element Text: " + elementText);// 关闭浏览器driver.quit();}
}

五、多层框架的定位

1. 框架概念

什么是框架(Frame)?

在一个网页上,框架(Frame)是一个网页中嵌套的子网页。想象一下你有一个大盒子(网页),里面装着几个小盒子(框架)。每个小盒子里又可以装着更多的小盒子或内容。框架帮助网页设计者将网页内容分成多个独立的部分,每个部分可以单独加载和操作。

为什么要使用框架?

  1. 组织内容:框架可以帮助将一个复杂的网页分成多个部分,使得每个部分可以独立加载和操作。例如,导航栏可以放在一个框架中,内容区域可以放在另一个框架中。

  2. 提高效率:由于每个框架可以独立加载,所以页面的一部分更新时,其他部分不需要重新加载,提高了网页的效率。

多层框架(Nested Frames)

多层框架是指在一个框架里再嵌套另一个框架,就像一个盒子里放着另一个盒子。这种情况可能会使得操作网页变得复杂,因为你需要告诉浏览器你想在哪个框架里操作。

举个例子

想象你正在操作一个带有导航栏和内容区域的网页:

  • 外层框架:这是整个网页的框架。
  • 内层框架1:在网页的左边有一个导航栏,这是一个独立的框架。
  • 内层框架2:在网页的右边有一个内容区域,这是另一个独立的框架。

当你想点击导航栏中的一个链接时,你需要先告诉浏览器你要操作的是导航栏框架,然后才能点击链接。同样,如果你想操作内容区域的某个按钮,你需要先切换到内容区域的框架,再进行操作。

在Selenium WebDriver中,处理多层框架和窗口定位、层级定位和下拉框处理是非常常见的任务。下面将详细介绍这些概念及其相关API的使用方法。

2. 多层框架的定位

在Web应用中,页面通常嵌套在多个框架(frame)中。为了在这些框架中进行操作,我们需要切换到相应的框架。

  1. 切换到框架: 使用driver.switchTo().frame()方法可以切换到指定的框架。可以通过框架的名字、ID或者WebElement对象来定位框架。

    // 通过框架的名字或ID切换到框架
    driver.switchTo().frame("frameNameOrId");// 通过WebElement对象切换到框架
    WebElement frameElement = driver.findElement(By.xpath("//iframe[@name='frameName']"));
    driver.switchTo().frame(frameElement);
    
  2. 切换回默认内容: 使用driver.switchTo().defaultContent()方法可以从嵌套的框架中跳回到最外层的默认页面。

driver.switchTo().defaultContent();

3. 多层窗口的定位

当页面中嵌套的不是框架而是窗口时,需要使用不同的方法来切换窗口。

  1. 切换到窗口: 使用driver.switchTo().window()方法可以切换到指定的窗口。可以通过窗口的名字或句柄(handle)来定位窗口。

// 获取当前窗口句柄
String currentWindow = driver.getWindowHandle();// 获取所有打开的窗口句柄
Set<String> allWindows = driver.getWindowHandles();// 遍历所有窗口句柄并切换到新窗口
for (String window : allWindows) {driver.switchTo().window(window);// 如果需要,可以在此处添加条件判断,确保切换到正确的窗口
}// 切换回原窗口
driver.switchTo().window(currentWindow);

4. 层级定位

在某些情况下,需要一层层地定位到具体的元素。例如,某些元素只有在特定操作之后才会显示。

// 定位父元素
WebElement parentElement = driver.findElement(By.id("parentElementId"));// 在父元素下定位子元素
WebElement childElement = parentElement.findElement(By.className("childElementClass"));// 进一步定位孙元素
WebElement grandChildElement = childElement.findElement(By.tagName("tag"));

5. 下拉框处理

下拉框是常见的页面元素,需要进行两次定位:一次定位到下拉框,然后定位到下拉框中的选项。

  1. 定位到下拉框并进行操作: 使用Select类来处理下拉框。

import org.openqa.selenium.support.ui.Select;// 定位下拉框元素
WebElement dropdown = driver.findElement(By.id("dropdownId"));// 创建Select对象
Select select = new Select(dropdown);// 通过可见文本选择选项
select.selectByVisibleText("OptionText");// 通过值选择选项
select.selectByValue("optionValue");// 通过索引选择选项
select.selectByIndex(1);

综合示例

package org.example;import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;import java.util.Set;public class BaiduExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开百度首页driver.get("https://www.baidu.com");// 获取并打印页面标题和当前URLString title = driver.getTitle();System.out.println("Page Title: " + title);String currentUrl = driver.getCurrentUrl();System.out.println("Current URL: " + currentUrl);// 定位搜索输入框并输入关键词WebElement searchBox = driver.findElement(By.id("kw"));searchBox.sendKeys("Selenium WebDriver");// 定位搜索按钮并点击WebElement searchButton = driver.findElement(By.id("su"));searchButton.click();// 暂停几秒等待搜索结果加载(实际项目中应使用显式等待)try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}// 获取当前窗口句柄String currentWindow = driver.getWindowHandle();// 获取所有打开的窗口句柄Set<String> allWindows = driver.getWindowHandles();// 如果有新窗口,切换到新窗口for (String window : allWindows) {if (!window.equals(currentWindow)) {driver.switchTo().window(window);break;}}// 打印搜索结果页面的标题String resultTitle = driver.getTitle();System.out.println("Result Page Title: " + resultTitle);// 处理可能存在的下拉框选项(这里假设有下拉框,仅为示例)try {WebElement dropdown = driver.findElement(By.id("dropdownId"));Select select = new Select(dropdown);select.selectByVisibleText("OptionText");} catch (Exception e) {System.out.println("No dropdown found or failed to interact with dropdown.");}// 关闭浏览器driver.quit();}
}

六、弹出框(Alert、Confirm、Prompt)的处理

在自动化测试中,处理浏览器弹出框(如 alert、confirm、prompt)是一个常见需求。Selenium WebDriver 提供了相应的方法来处理这些弹出框。

处理 alert、confirm、prompt 弹出框的方法:

1. 获取弹出框中的文字信息:

  • getText() 方法用于获取弹出框中的文字信息。
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
System.out.println(alertText);

2. 接受弹出框:

  • accept() 方法用于点击弹出框中的确认按钮。
alert.accept();

3. 拒绝弹出框:

  • dismiss() 方法用于点击弹出框中的取消按钮(如果有)
alert.dismiss();

4. 在弹出框中输入值:

  • sendKeys() 方法用于在弹出框的输入框中输入值。这仅适用于 prompt 弹出框。
alert.sendKeys("Some text");
alert.accept();

七、处理 DIV 对话框

有时页面上的元素很多,通过属性无法准确定位元素,这时可以先定位元素所在的 div 块,然后再定位这个元素。这种方法有助于提高定位的准确性。

示例:

WebElement divBlock = driver.findElement(By.id("divID"));
WebElement targetElement = divBlock.findElement(By.className("targetClass"));
targetElement.click();

八、上传文件操作

文件上传操作在 web 应用中也很常见。Selenium WebDriver 处理文件上传并不复杂,关键是通过 sendKeys() 方法将文件路径传递给文件上传输入框。

WebElement uploadButton = driver.findElement(By.id("uploadButton"));
uploadButton.sendKeys("C:\\path\\to\\file.txt");

这里有几点需要注意:

  • 文件路径可以是绝对路径或相对路径。
  • 上传的文件必须存在于指定路径中。
  • sendKeys() 方法用于直接输入文件路径。

示例代码

下面是一个综合示例,展示如何处理 alert 弹出框以及文件上传操作:

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class SeleniumExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开示例网页driver.get("https://example.com");// 处理 alert 弹出框WebElement alertButton = driver.findElement(By.id("alertButton"));alertButton.click();Alert alert = driver.switchTo().alert();System.out.println(alert.getText());  // 打印弹出框中的文字信息alert.accept();  // 点击确认按钮// 文件上传操作WebElement uploadButton = driver.findElement(By.id("uploadButton"));uploadButton.sendKeys("C:\\path\\to\\file.txt");  // 上传文件// 关闭浏览器driver.quit();}
}

 附录

1. 设置ChromeDriver的路径

在使用Selenium进行自动化测试时,我们需要一个浏览器驱动程序(比如ChromeDriver)来控制浏览器的操作。浏览器驱动程序是与浏览器进行通信的桥梁。我们需要告诉Selenium在哪里可以找到这个驱动程序,这就是 System.setProperty 的作用。

System.setProperty 方法

System.setProperty 方法用于设置系统属性。它接受两个参数:

  • 第一个参数是系统属性的名称。
  • 第二个参数是系统属性的值。

在这个例子中,我们设置的是 webdriver.chrome.driver 系统属性,它的值是ChromeDriver可执行文件的路径。

具体代码解释
// 设置ChromeDriver的路径 
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

这行代码的含义是告诉Selenium,ChromeDriver可执行文件位于 /path/to/chromedriver。我们需要将 /path/to/chromedriver 替换为本地计算机上ChromeDriver可执行文件的实际路径。

重要提示

  • 确保下载的ChromeDriver版本与Chrome浏览器的版本匹配。
  • 将ChromeDriver放在一个合适的位置,并确保路径正确。
http://www.ds6.com.cn/news/13512.html

相关文章:

  • 网站cdn加速怎么入侵河北网络科技有限公司
  • 品牌型网站建设哪网站源码建站
  • 网站域名注册时间seo优化培训班
  • 营销网站建设工作超级外链推广
  • 系统开发者选项怎么关win7优化工具哪个好用
  • 免费做网站平台优化大师破解版app
  • 网站如何做排名seo搜索优化技术
  • 用wordpress做网站教程如何在网络上推广产品
  • 广西建设职业技术学院管理工程系网站2014考试前培训时间网站域名查询工具
  • wordpress不用模版四川seo推广方案
  • 贵州做网站的公司链接购买
  • 自己建网站有什么用百度合伙人官方网站
  • 住宅小区物业管理系统网站建设seo外包费用
  • 自己做网站网站资源哪里来营销百度app下载手机版
  • 如何用付费音乐做视频网站百家号seo
  • 卖高权重网站做跳转整合营销
  • 做策划的都上哪些网站搜索资料间网络推广怎么做好
  • 房屋 哪个网站做的最好seo工作职责
  • 揭阳网站制作机构长沙大型网站建设公司
  • 邵阳网站建设多少钱优化网站排名茂名厂商
  • 学做网站多久官网排名优化方案
  • 微网站开发平台有哪些好的百度推广助手app下载
  • 网页生成助手seo导航
  • 他达拉非能延时多久seo服务公司招聘
  • 青岛建站模板厂家网站seo排名优化软件
  • 跨境电商平台数据优化关键词排名哪家好
  • 外贸企业网站功能要求互联网公司排名
  • 新余网站开发公司seo优化方法有哪些
  • 金融类网站模板北京网站优化技术
  • 本地门户网站源码职业技能培训有哪些