selenium-05-常见问题
一:日期控件
selenium不能直接對日期控件操作,可以通過js對日期控件做賦值操作
?
WebElement inputTimeBox=driver.findElement(by.name("###"));
????????????????????????//定位日期控件
Stringtime =?"2015/10/10";
((JavascriptExecutor)driver).executeScript("arguments[0].value=arguments[1]",inputTimeBox, time); ?
? ? ? ? ? ? ? ? ? ? ? ?//通過JS給日期控件賦值
?
此方法比較簡便,但因為是給日期控件直接賦值,無法驗證日期控件是否正常
?
二:上傳控件
?
selenium無法直接操作windows窗體,上傳控件有屬性(type="file")時,可直接sendkeys處理上傳文件
?
WebElement adFileUpload = driver.findElement(By.id(" ###"));
????????????????????// 定位上傳控件?
String filePath = "C:\\test\\uploadfile \\test.jpg";
????????????????????// 定義了一個本地文件的路徑?
adFileUpload.sendKeys(filePath);
????????????????????// 為上傳控件進行賦值,將需要上傳的文件路徑賦給控件
?
當上傳控件是flash時,分享兩個解決方案:
?
1、借助Autolt工具,識別上傳控件
?
詳情可參考:https://ke.qq.com/course/140125#term_id=100157931
這個鏈接是testfan樓大管家分享的公開課的視頻地址,可以現在觀看,記得選擇高清720p的模式學習哦~
?
2、模擬鍵盤操作
思路:將上傳文件的路徑模擬鍵盤操作復制粘貼到文件名框中,然后再模擬鍵盤的回車事件,上傳文件,如下圖
第1步:將文件路徑獲取到windows剪切板(string參數)
?
public static void setClipboardData(String string) {
? ?StringSelection stringSelection = new StringSelection(string);
? ?Toolkit.getDefaultToolkit().getSystemClipboard()
? ? ? ?.setContents(stringSelection, null);
?} ? ? ? ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
第2步:將要上傳的文件的路徑通過windows快捷鍵ctrl+v粘貼到文件名控件中
?
String filePath = "E:\\1.txt";
?????????????????????????????????????//上傳的文件路徑
setClipboardData(filePath); ?
????????????????????????????????//將文件路徑傳到剪切板
//下面通過robot模擬粘貼快捷鍵
?Robot robot = null;
? ? try {
? ? ? robot = new Robot();
? ? } catch (AWTException e1) {
? ? ? e1.printStackTrace();
? ? } ? ? ? ? ? ? ? ?
? ? ? ? ? ????????? ? //robot模擬鍵盤操作,模擬鍵盤操作有其它方法,類似
?
robot.keyPress(KeyEvent.VK_CONTROL);
? ? robot.keyPress(KeyEvent.VK_V); ? ? ? ? ?
????????????????????????//同時按下CONTROL+V,將上傳文件路徑黏貼到文件名
? ? robot.keyRelease(KeyEvent.VK_V);
? ? robot.keyRelease(KeyEvent.VK_CONTROL); ?
????????????????????????// 釋放CONTROL+V
?
?robot.keyPress(KeyEvent.VK_ENTER); ? ? ?
????????????????????????//回車事件,相當于點擊打開
?
針對上傳,下載,彈出警告窗口等,都可借鑒以上兩種方法處理,當然方法還有很多。
三:頁面隱藏元素
針對頁面隱藏元素的”display: none” 的情況,selenium沒法直接操作元素,需要通過js將元素的none值改為'block':
?
JavascriptExecutor js=(JavascriptExecutor)driver;
?js.executeScript("document.getElementById('li').style.display='block';"); ? ???//通過js把隱藏元素顯示出來
?
四:彈出窗口的處理
for (int a = 0; a < =9; a++) { ?
? ???? Set ?windowHandles = driver.getWindowHandles();?
????????????????????????????????????????????????????//獲得所有窗口的句柄
? ???? for (String handler : windowHandles) {
? ?????????driver.switchTo().window(handler);?
? ?????????String title = driver.getTitle();?
? ?????????if (windowTitle.equals(title)) {?
? ? ????????????????a = 10; ?
? ? ????????????????break;
? ?????????}?
????? }?
?}?
?
代碼中的windowTitle需要替換成目標窗口的title屬性的實際值,上面這段代碼最好定義成一個公共方法封裝起來~
?
for (int a = 0; a < =9; a++)這個循環的作用是提高穩定性,個別瀏覽器情況下一次遍歷不到,會跳轉失敗
?
五:富文本框編輯器driver.switchTo().frame("frame"); ? ? ???// 定位到富文本輸入框所在的 frame?
JavascriptExecutor js = (JavascriptExecutor) driver; ??
js.executeScript("document.body.innerHTML='ABCDEFG'");
????????????????????// 通過 js對富文本框賦值?
六:鼠標雙擊事件
Actions action =?new?Actions(driver);?
action.doubleClick(driver.findElement(by.id(####))).perform(); ? ? ? ??//鼠標停留在當前位置做雙擊事件
?
很多人在模擬雙擊事件是不成功,是因為沒有在后面追加perform()
?
同理,模擬鼠標懸浮的操作
action.moveToElement(driver.findElement(by.id(####))).perform();
六:元素高亮
有時候在操作元素時操作失敗,原因:1、定位錯誤 2、元素不可操作 ?如果無法確定失敗原因,可以先用元素高亮的方法判斷是否定位到該元素,在判斷失敗的原因
?
publicvoid?highlightElement(WebDriver driver,WebElement element) { ?
????? JavascriptExecutor js =(JavascriptExecutor) driver;
????? js.executeScript("element = arguments[0];"?+
???????????"original_style =element.getAttribute('style');"?+
????????????"element.setAttribute('style',original_style + \";"?+
???????????"background: yellow; border: 2px solidred;\");"?+
???????????"setTimeout(function(){element.setAttribute('style',original_style);}, 1000);", element);
} ? ? ? ? ? ? ? ? ? ? ? ? ?//封裝一個方法
?
highlightElement(driver,element) ? ? ?//調用,element是需要定位的目標元素
?
文章轉載自:http://ask.testfan.cn/article/26
轉載于:https://www.cnblogs.com/i16i1007/p/6624161.html
總結
以上是生活随笔為你收集整理的selenium-05-常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯云挂在和格式化数据盘
- 下一篇: Android之四大组件、六大布局、五大