Fork me on GitHub

Web UI 自动化测试学习笔记

Web UI 自动化测试学习笔记

1.读取csv文件

1.1 字符串转换成数字

//将某一单元格的值转换成字符串
string Item = Baseline.Row[i][j].ToString();
//去除\
string Item = Regex.replace(Item,"\"","");
//将字符串转换成double数据
double BaselineVal=Convert.ToDouble(Item);

1.2 避免ToDouble()处理字符型字符串的异常

1)使用try...catch...

try{
double BaselineVal=Convert.ToDouble(Item);
}
catch{

}

2)使用Regex,判断字符串是否为数字字符串

转载:C#判断字符串是否为数字字符串

【方法二】:通过正则表达式来判断。 用正则表达式来验证字符串是否为数字字符串。我们要用到Regex类的isMatch()方法。该类在System.Text.RegularExpressions; 您可以通过using System.Text.RegularExpressions;导入命名空间来访问Regex类。也可以直接通过System.Text.RegularExpressions.Regex 来访问。

protected bool isNumberic(string message,out int result)
{
System.Text.RegularExpressions.Regex rex=
new System.Text.RegularExpressions.Regex(@"^\d+KaTeX parse error: Expected 'EOF', got '}' at position 185: … return false; }̲ 通过正则表达式判断是否匹配,…"))
{
//成功
Page.ClientScript.RegisterStartupScript(this.GetType(), “”, “”);
}

 

补充

//正则匹配 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):\x00-\xff 匹配空行的正则表达式:\n[\s| ]\r 匹配HTML标记的正则表达式:/<(.)>.</\1>|<(.) />/ 匹配首尾空格的正则表达式:(^\s)|(\s$)(像vbscript那样的trim函数) 匹配Email地址的正则表达式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)* 匹配网址URL的正则表达式:http://([\w-]+.)+[\w-]+(/[\w- ./?%&=]*)?

以下是例子: 利用正则表达式限制网页表单里的文本框输入内容: 用正则表达式限制只能输入中文:οnkeyup=“value=value.replace(/\u4E00-\u9FA5/g,’’)” onbeforepaste=“clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/\u4E00-\u9FA5/g,’’))” 1.用正则表达式限制只能输入全角字符: οnkeyup=“value=value.replace(/\uFF00-\uFFFF/g,’’)” onbeforepaste=“clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/\uFF00-\uFFFF/g,’’))” 2.用正则表达式限制只能输入数字:οnkeyup="value=value.replace(/\d/g,’’) "onbeforepaste=“clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/\d/g,’’))” 3.用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(/[\W]/g,’’) "onbeforepaste=“clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/\d/g,’’))”

2.拖动元素问题

WebDriver相关API:

//从元素From向左偏移OffsetX, 向右偏移OffsetY
driver.DragAndDropByOffset(From,int OffsetX,int OffsetY);
//从From偏移到To
driver.DragAndDrop(From,To);
//按住From,鼠标移动到To,释放鼠标
driver.ClickAndHold(From).MoveToElement(To).Release().Build().Perform();
//鼠标向右偏移x,向下偏移y(遇到不好区分的两个元素,微移鼠标实现选取)
driver.MoveByOffset(x,y)

3.Input输入框无法获取文本及更改文本

常规办法:

//获取文本
driver.findElementByXpath("Locator").Text;
//更改文本
driver.findElementByXpath("Locator").Click().Clear().Send_keys("Keys").Build().Perform();

Javascript语句处理:

//获取文本
return driver.execute_script("ducument.getElementById('id').value")
//更改文本
driver.executeScript("ducument.getElementById('id').value='target'")
   or
//$("#id").val(“value”);

4.Xpath定位方式

转:https://www.cnblogs.com/wangyi0419/p/11644394.html

  [CSDN]Python Selenium Xpath高级定位用法

xpath定位:

  • 文本定位,//a[text()='hahahah']
  • 模糊定位: //input[contains(@class,'abc')],//input[contains(text(),'abcde')],//div[starts-with(@href,'http')],//div[ends-with(@href,'com')]
  • 逻辑定位://div[@id='hehe' and/or @class='haha'] 有的页面有动态id,并且id中一部分是不变的,就可用contains定位
  • # 匹配id以submit开头的元素,如:id='submit'
    driver.find_element_by_xpath("//input[start-with(@id,'submit')]")

  • # 匹配所有input元素中含有属性的值为readonly的元素
    driver.find_element_by_xpath("//input[@*='readonly']"))

  • # 匹配id以submit结尾的元素,如:id='submit'
    driver.find_element_by_xpath("//input[ends-with(@id,'submit')]")

  • # 匹配id中含有submit的元素,如:id='submit'
    driver.find_element_by_xpath("//input[contains(@id,'submit')]")

    # 匹配name属性中包含na关键字的页面元素
    driver.find_element_by_xpath("//input[contains(@name,'na')]")

  • # 表示过虑掉在 div id='query_reulst_box' 的下的 style 标签和 meta 标签
    driver.find_element_by_xpath("//div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())

  • # 表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素
    driver.find_element_by_xpath("/div/form/input[last()]")

  • # 查找所有input标签中含有type属性的元素
    driver.find_element_by_xpath("//input[@type]")

    # 查找所有a标签中含有onclick属性的元素
    driver.find_element_by_xpath("//a[@onclick]")

    .....

5.三种等待方式

转:https://www.cnblogs.com/wangyi0419/p/11644394.html

强制等待sleep:

不够灵活,有时会浪费时间,不建议在实际项目中使用,多用于脚本调试;

隐式等待implicitly_wait(time):

针对页面,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。 这样的隐式等待会有个坑,我们都知道js一般都是放在我们的body的最后进行加载,实际这是页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。

显式等待WebDriverWait:

python版

程序每隔0.5秒(默认)检索一下页面,如果给定的条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。 隐式等待和显示等待都存在时,超时时间取二者中较大的。 至于等待的条件expected_conditions,那真是五花八门:

locator = (By.ID,'kw')
driver.get(base_url)

WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
'''判断title,返回布尔值'''

WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
'''判断title,返回布尔值'''

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
'''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement'''

WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
'''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''

WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
'''判断元素是否可见,如果可见就返回这个元素'''

WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))
'''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''

WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))
'''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))
'''判断指定的元素中是否包含了预期的字符串,返回布尔值'''

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))
'''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''

\#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''
\#注意这里并没有一个frame可以切换进去

WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
'''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
\#注意#swfEveryCookieWrap在此页面中是一个隐藏的元素

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
'''判断某个元素中是否可见并且是enable的,代表可点击'''
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
\#WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()

\#WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
'''等待某个元素从dom树中移除'''
\#这里没有找到合适的例子

WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))
'''判断某个元素是否被选中了,一般用在下拉列表'''

WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))
'''判断某个元素的选中状态是否符合预期'''

WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))
'''判断某个元素的选中状态是否符合预期'''
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

instance = WebDriverWait(driver,10).until(EC.alert_is_present())
'''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
print instance.text
instance.accept()

 

java版 

转:https://www.cnblogs.com/tester-ggf/p/12602211.html

具体使用案例:

1.查找元素是否已经加载出来

CopyWebDriverWait wait = new WebDriverWait(driver, 5);
// 查找id为“kw"的元素是否加载出来了(已经在页面DOM中存在)
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));

// 在设定时间内找到后就返回,超时直接抛异常

2.查找元素是否可见

CopyWebDriverWait wait = new WebDriverWait(driver, 5);
// 查找id为"kw"的元素是否可见
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw")));

3.查找元素是否可点击

CopyWebDriverWait wait = new WebDriverWait(driver, 5);
// 查找id为"kw"的元素是否可以点击
wait.until(ExpectedConditions.elementToBeClickable(By.id("kw")));

4.自定义方法,重写ExpectedCondition中的apply方法

Copy/*
自定义查找元素的方法,对元素查找方法进行二次封装,更加的灵活,可以加上自己逻辑。
*/
public WebElement getElement(long timeOutInSecond, By by) {
       WebDriverWait wait = new WebDriverWait(driver, timeOutInSecond);
       WebElement element = wait.until(new ExpectedCondition<WebElement>() {
           @NullableDecl
           @Override
           public WebElement apply(@NullableDecl WebDriver webDriver) {
               return webDriver.findElement(by);
          }
      });
       
       return element;
  }

ExpectedConditions类中常用方法#

方法描述
presenceOfElementLocated(By locator) 判断某个元素是否被加到了dom树里,并不代表该元素一定可见;
visibilityOfElementLocated(By locator) 判断某个元素是否可见(代表元素非隐藏,元素的宽和高都不等于0);
elementToBeClickable(By locator) 判断某个元素中是否可见并且是enable的且可点击;
elementToBeSelected(By locator) 判断某个元素是否被选中了,一般用在下拉列表;
alertIsPresent() 判断页面上是否存在alert;
titleIs(String title) 判断当前页面的title是否精确等于预期;
titleContains(String title) 判断当前页面的title是否包含预期字符串;
textToBePresentInElement(By locator, String text) 判断某个元素中的text是否包含了预期的字符串;
textToBePresentInElementValue(By locator, String text) 判断某个元素中的value属性是否包含了预期的字符串;
invisibilityOfElementLocated(By locator) 判断某个元素中是否不存在于dom树或不可见;
frameToBeAvailableAndSwitchToIt(By) 判断iframe可用,并且切换到iframe中

6.键鼠操作

转:https://www.cnblogs.com/wangyi0419/p/11644394.html

键盘操作:

python版

send_keys(Keys.CONTROL,'a') Ctrl+A 全选 组合键
send_keys(Keys.CONTROL,'c') Ctrl+C 复制
send_keys(Keys.CONTROL,'x') Ctrl+X 剪切
send_keys(Keys.CONTROL,'v') Ctrl+V 粘贴
Keys.TAB Keys.F5 Keys.SPACE

java版

  • sendKeys(Keys.BACK_SPACE) 回格键(BackSpace)

  • sendKeys(Keys.SPACE) 空格键 (Space)

  • sendKeys(Keys.TAB) 制表键 (Tab)

  • sendKeys(Keys.ESCAPE) 回退键(Esc)

  • sendKeys(Keys.ENTER) 回车键(Enter)

  • sendKeys(Keys.CONTROL,'a') 全选(Ctrl+A)

  • sendKeys(Keys.CONTROL,'c') 复制(Ctrl+C)

  • sendKeys(Keys.CONTROL,'x') 剪切(Ctrl+X)

  • sendKeys(Keys.CONTROL,'v') 粘贴(Ctrl+V)

  • sendKeys(Keys.F1) 键盘 F1

鼠标操作:

python版

ele = driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_settingicon']")
实例化ActionChains类:ac = ActionChains(driver)
\#鼠标悬停:ac.move_to_element(ele)
调用perform()来执行鼠标操作:ac.perform()
由于ActionChains类里面的方法除了perform其他都是return self,返回类的实例,所以支持链式调用:
ActionChains(driver).move_to_element(ele).perform()
\# 鼠标双击
ActionChains(driver).double_click(ele).perform()
\# 鼠标右键
ActionChains(driver).context_click(ele).perform()

java版

模拟鼠标#

转:https://www.cnblogs.com/tester-ggf/p/12602211.html

在WebDriver中,关于鼠标的操作我们可以通过 Actions 类来模拟鼠标右击、双击、悬停、拖动等操作。

Actions 类中鼠标操作常用方法:

方法描述
contextClick() 鼠标右击
clickAndHold(WebElement) 点击并控制(模拟悬停)
doubleClick(WebElement) 鼠标双击
dragAndDrop(webElement1,webElement2) 鼠标拖动
moveToElement(WebElement) 鼠标移动到某个元素上
perform() 执行所有Actions中存储的行为
click() 鼠标单击(左击)

7.select下拉框

转:https://www.cnblogs.com/wangyi0419/p/11644394.html

# 定位到select元素
ele = driver.find_element_by_link_text('设置')
# ele = driver.find_element_by_xpath("//*[@id='u1']/a[@name='tj_settingicon']")
ActionChains(driver).move_to_element(ele).perform()
driver.find_element_by_link_text('高级搜索').click()
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//select[@name='ft']")))
select_ele = driver.find_element_by_xpath("//select[@name='ft']")
# 实例化Select类
s = Select(select_ele)
# 直接选,三种方式
s.select_by_index(4)
time.sleep(0.5)
s.select_by_value("doc")
time.sleep(0.5)
s.select_by_visible_text("所有格式")

8.js处理滚动条

定位滚动条之前console查询滚动条位置

  &x("//div[@class='sdsadasdasd']")

如果滚动条位于查询结果列表第3条,javascript语句为

var action= document.getElementsByClassName('className')[2].scrollTo(10000,0)

  • 处理页面滚动到底部

window.scrollTo(0,document.body.scrollHeight)

  • 处理不可见不可定位元素

Console下输入:

var action= document.documentElement.scrollTop=10000;

代码如下:

public void ScrollToTarget(){
int height = 0;
while(height<10000)
{
//ClassName属于滚动条控制面板   js.execute($"document.getElementsByClassName('className').scrollTop={height}“);   height+=300;   if(element.isAppear())   {     break;   } }
}

转:https://www.cnblogs.com/wangyi0419/p/11644394.html

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.implicitly_wait(20)
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_id('kw').send_keys('刘亦菲',Keys.ENTER)
# 上面点击搜索后应等待元素加载完毕再去定位元素,否则会报错,找不到
WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,"//div[@id='6']//h3//a")))
# 刘亦菲的个人微博,当然,id会有变化
lyf_ele = driver.find_element_by_xpath("//div[@id='6']//h3//a")
# 找一个不在当前显示区域的元素,若直接去点击会报错,应该下拉到那个元素,将他在显示区域置顶或置底
time.sleep(2)
# 滚动条拉到指定元素位置
driver.execute_script("arguments[0].scrollIntoView(false);",lyf_ele)
# driver.execute_script("arguments[0].scrollIntoView();",lyf_ele) # 会被顶部盖住
time.sleep(2)
lyf_ele.click()
# WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located)
# WebDriverWait(driver,20).until(EC.presence_of_all_elements_located)
driver.switch_to.window(driver.window_handles[-1]) # 打开一个新窗口后一定要记住要切换窗口,老是忘记!!!
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 拉到页面底部
time.sleep(2)
driver.execute_script("window.scrollTo(0,0)") # 拉到页面顶部
time.sleep(2)
driver.execute_script("window.scrollTo(0,200)") # 下拉200个像素
time.sleep(2)
driver.set_window_size(600, 500) # 缩小窗口,出现横向滚动条
time.sleep(2)
driver.execute_script("window.scrollTo(document.body.scrollWidth,0)") # 移到最右边
time.sleep(2)
driver.execute_script("window.scrollTo(0,0)") # 拉到页面最左边
time.sleep(2)
driver.execute_script("window.scrollTo(200,0)") # 右拉200个像素
time.sleep(2)
driver.quit()
#获取当前窗口的宽度和高度:document.body.scrollWidth 、document.body.scrollHeight

java版

转:https://www.cnblogs.com/tester-ggf/p/12602211.html

用于调整浏览器滚动条位置的JavaScript代码如下:

Copy<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);

将滚动条滚动到某个区域后停止(页面元素全部加载完成),如下:

Copy//滚动到某一区域
//scrollIntoView(0); 让元素滚动到可视区域的最下方
//scrollIntoView(); 让元素滚动到可视区域的最上方
//JavascriptExecutor javascriptExecutor = (JavascriptExecutor)BrowserUtil.driver;
//javascriptExecutor.executeScript("document.getElementById('index_ads').scrollIntoView(0);");
//JavaScript的参数传递-selenium和js的交互
//1、先去找到这个元素
WebElement webElement = driver.findElement(By.xpath("element"));
//2、找到的元素作为参数传入到Js代码中
JavascriptExecutor javascriptExecutor = (JavascriptExecutor)driver;
javascriptExecutor.executeScript("arguments[0].scrollIntoView(0)",webElement);

页面元素是通过懒加载方式,需要一直进行滚动的

Copy/**
* 滑动列表找元素并且进行点击(懒加载)
* @param selectedText 选中元素文本
* @param by 正在加载类似元素的定位表达式
*/
public static void clickElementInList(String selectedText, By by) {
   // 滑动之前的页面源代码信息
   String beforeSource = "";
   // 滑动之后的页面源代码信息
   String afterSource = "";
   // 循环条件
   // 1、找到了元素,跳出循环
   // 2、如果没有找到元素???怎么跳出循环
   while (true) {
       WebElement webElement = driver.findElement(by);
       // 获取页面源代码
       beforeSource = driver.getPageSource();
       // 获取js执行器
       JavascriptExecutor javascriptExecutor = (JavascriptExecutor)driver;
       // 执行js
       javascriptExecutor.executeScript("arguments[0].scrollIntoView(0);", webElement);
       
       // 如果当前页面有想要的元素,怎么判断是否有??--getPageSource
       if (driver.getPageSource().contains(selectedText)) {
           driver.findElement(By.linkText(selectedText)).click();
           // 找到元素退出循环,不再滚动。
           break;
      }

       afterSource = driver.getPageSource();
       // 页面元素没有变化---滑动到了最底部
       if (afterSource.equals(beforeSource)) {
           // 到达底部,退出。
           break;
      }

  }
}

9.js处理只读元素

转:https://www.cnblogs.com/wangyi0419/p/11644394.html

js处理12306网站日期选择弹出框,改只读为可写:
driver = webdriver.Chrome()
driver.implicitly_wait(20)
driver.get('https://www.12306.cn/index/')
js = "var ele = document.getElementById('train_date');ele.readOnly=false;ele.value='2019-10-01'"
driver.execute_script(js)
driver.find_element_by_id('search_one').click()
time.sleep(1)
driver.quit()

10.特殊操作

页面加载超时设置#

转:https://www.cnblogs.com/tester-ggf/p/12602211.html

通过TimeOuts 对象进行全局页面加载超时的设置,该设置必须放置get 方法之前。如下代码:

Copydriver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.get("https://www.baidu.com");

如果百度首页在超过5秒钟没有加载完毕,程序就会抛出异常,如果在 2秒就加载完了,就直接往下执行,如果需要对页面加载时间有要求的,可以用这个设置进行检验。

文件上传(java版)

转:https://www.cnblogs.com/tester-ggf/p/12602211.html

接下来通过sendKeys()方法来实现文件上传。

Copyimport java.io.File;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


public class UpFileDemo {

 public static void main(String[] args) throws InterruptedException {

   WebDriver driver = new ChromeDriver();
   File file = new File("./HTMLFile/upfile.html");
   String filePath = file.getAbsolutePath();
   driver.get(filePath);

   //定位上传按钮, 添加本地文件
   driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");
   Thread.sleep(5000);

   driver.quit();
}
}

 

posted @ 2021-09-25 21:32  浩然哉  阅读(294)  评论(0)    收藏  举报
/* 看板娘 */
浏览器标题切换
浏览器标题切换end