在这篇文章中,我们将为您详细介绍无法使用带有Java的SeleniumWebDriver打开IE11驱动程序实例的内容,并且讨论关于无法使用javac的相关问题。此外,我们还会涉及一些关于IE上的Ja
在这篇文章中,我们将为您详细介绍无法使用带有Java的Selenium WebDriver打开IE11驱动程序实例的内容,并且讨论关于无法使用javac的相关问题。此外,我们还会涉及一些关于IE上的Java中无法使用Selenium WebDriver获取新的窗口句柄、javascript – 无法使用Selenium Webdriver中的send_keys上传文件、JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测、node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 无法使用带有Java的Selenium WebDriver打开IE11驱动程序实例(无法使用javac)
- IE上的Java中无法使用Selenium WebDriver获取新的窗口句柄
- javascript – 无法使用Selenium Webdriver中的send_keys上传文件
- JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测
- node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?
无法使用带有Java的Selenium WebDriver打开IE11驱动程序实例(无法使用javac)
System.setProperty("webdriver.ie.driver","C:\\Users\\IEDriverServer_Win32_2.45.0\\IEDriverServer.exe"); WebDriver driver = new InternetExplorerDriver(); driver.get("http://xxx");
执行上述代码时显示错误:
线程“主”中的异常org.openqa.selenium.remote.SessionNotFoundException:启动Internet
Explorer发生意外错误。所有区域的保护模式设置都不相同。对于所有区域,“启用保护模式”必须设置为相同的值(启用或禁用)。(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:1.33秒
有人可以建议解决此问题吗?
答案1
小编典典如果u在没有访问权限的情况下位于代理后面,则无法更改保护模式设置,请使用此功能
DesiredCapabilities cap = DesiredCapabilities.internetExplorer(); cap.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
这会带来一些脆弱感
IE上的Java中无法使用Selenium WebDriver获取新的窗口句柄
如何解决IE上的Java中无法使用Selenium WebDriver获取新的窗口句柄?
您需要做两件事:
- 在IE浏览器中更改安全设置:
打开IE浏览器,单击“ Internet选项” =>“安全” =>选中“启用保护模式”,以表示“ Internet”,“本地Intranet”,“受信任的站点”和“受限制的站点”。
这使IE驱动程序能够控制新窗口的句柄,以便在调用driver.getwindowHandles();
或driver.getwindowHandles().size();
时将获得所有句柄,包括原始窗口和新窗口。为了更加准确,您只需要将所有4个域的安全设置都设置为相同即可,这意味着您可以取消选中所有4个域的“启用保护模式”,但是显然不建议这样做。
- 调用之后
driver.switchTo().window(windowName);
,需要添加((JavascriptExecutor) driver).executeScript("window.focus();");
IE驱动程序才能在窗口上执行任何操作。
这是因为IE驱动程序需要它正在处理的窗口在前台,因此此行可帮助驱动程序获得窗口的焦点,以便它可以对所需的窗口执行任何操作。
以下是一个完整的示例:
@H_301_26@ String baseWin = driver.getwindowHandle();
//Some methods to open new window, e.g.
driver.findElementBy("home-button").click();
//loop through all open windows to find out the new window
for(String winHandle : driver.getwindowHandles()){
if(!winHandle.equals(baseWin)){
driver.switchTo().window(winHandle);
//your actions with the new window, e.g.
String newURL = driver.getcurrenturl();
}
}
//switch back to the main window after your actions with the new window
driver.close();
driver.switchTo().window(baseWin);
//let the driver focus on the base window again to continue your testing
((JavascriptExecutor) driver).executeScript("window.focus();");
解决方法
当我单击页面上的按钮(在IE浏览器中)时,将打开一个新的弹出页面。我尝试获取此弹出窗口的窗口句柄失败。这是我的第一次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
Set<String>s = driver.getWindowHandles();
Iterator<String> ite = s.iterator();
while ( ite.hasNext() ) {
String popUpHandle = ite.next();
if(!baseWin.equals(popUpHandle)) {
driver.switchTo().window(popUpHandle);
System.out.println(driver.switchTo().window(popUpHandle).getTitle());
此尝试仅打印基本窗口的句柄,并且如果第二个print语句放置在if()语句之外,但在while()语句内以及if()语句之后,则仅输出基本窗口的标题。因此,这组句柄似乎只包含基本窗口句柄。
这是我的第二次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
ArrayList<String> popUpWin = new ArrayList<String>(driver.getWindowHandles());
popUpWin.remove(baseWin);
driver.switchTo().window(popUpWin.get(0));
System.out.println(driver.switchTo().window(popUpWin.get(0)));
尝试返回一个错误,该错误表明数组popUpWin为空,即size
==0。因此,当我调用driver.getWindowHandles()时,不会检索弹出窗口的句柄,而仅包含基本窗口的句柄。这是IE问题吗?有解决方法吗?还是我忽略了代码中的某些内容?(请注意,我忽略了此处包含的代码中的暂停,所以我不认为这是问题所在。)
javascript – 无法使用Selenium Webdriver中的send_keys上传文件
我已尝试在其他网页上进行文件上传,我让它至少在另一个页面上工作,但是当我尝试在页面上尝试相同的程序时,似乎没有任何事情发生.我想我记得找到其他人无法让这个工作的例子,所以我不认为我是唯一一个有这个问题的人.
可能相关的一件事是,当我在文件上传表单上尝试send_keys时,selenium抛出一个错误,说该元素不可见,因此无法与之交互(实际上,它是可见的,但显然不是在硒的眼睛里).我通过事先运行这行JavaScript修复了这个问题:
document.getElementById('UploadDocumentPopup').style.display = 'block';@H_301_13@(UploadDocumentPopup)是文件输入部分的父元素)
另一个可能有用的消息是,当我使用Selenium 1 / Selenium RC时,我成功地使用了attach_file命令(但是仅支持Firefox).
如果它有帮助,这里是如何进入我正在使用的页面.点击此链接:https://qa.infosnap.com/family6/gosnap.aspx?action=3345&culture=en,点击“继续工作”,然后使用电子邮件aaaa@b.com和密码“asdfjkl;”(不带引号)登录.然后单击“继续工作”链接之一.您访问的页面应包含文档上传和照片上传部分.如果没有,只需使用“prev”和“next”来浏览并找到所做的页面(只有3页).这是相关的代码 – 我也尝试了很多其他的东西,如果它有用,我很乐意分享,如果我能记住它们,但这就是我认为“应该”工作的方式.如果您准备好了,请随意检查页面源,但是FYI’documentfile’是页面源中输入type =’file’元素的名称,最后一行中的xpath指向“upload” “按钮.
js = "document.getElementById('UploadDocumentPopup').style.display = 'block';" wd.execute_script(js) wd.find_element_by_link_text("Upload Document...").click() wd.find_element_by_id("documentfile").send_keys("C:\\Users\\username\\testdoc.rtf") #ActionChains(wd).send_keys(Keys.ESCAPE) wd.find_element_by_xpath("//div[@id='modal_container']/div/form/div/input[1]").click()@H_301_13@更新:我意识到我没有尝试过除了Firefox以外的任何东西,所以我尝试了IE11 – 发生的事情是,当调用send_keys时,本机操作系统文件上传框出现了(我觉得很奇怪,因为我没有单击“浏览”按钮 – 仅使用send_keys),并将文本输入文件名字段.然后文件上传对话消失了,但好像什么也没发生过.回顾:在Internet Explorer中,文件上传对话框打开,文件路径进入此对话框,对话框消失,但没有实际附加文件.在Firefox中,没有对话框打开,仍然没有附加文件. Chrome与Firefox相同.
编辑:这是文档上传部分的HTML代码:
<div id="UploadDocumentPopup"https://www.jb51.cc/tag/dis/" target="_blank">display:none;"> <div> <h1https://www.jb51.cc/tag/ott/" target="_blank">ottom:10px; border-bottom:1px solid #CCCCCC;"> Upload Document </h1> <p> Choose a file to upload. </p> <form id="documentuploadform" action="services/documentservice.aspx" enctype="multipart/form-data" method="post" onsubmit="return aim.submit(this,{'onStart' : startUploadDocument,'onComplete' : completeUploadDocument})"> <input type="file" size="50" id="documentfile" name="documentfile" /> <input type="hidden" name="cmd" value="upload" /> <input type="hidden" id="documentuploadfield" name="field" /> <div> <input name="ctl00$OutsideFormContentPlaceholder$ctl06" type="submit" value="Upload" /> <input name="ctl00$OutsideFormContentPlaceholder$ctl07" type="button" onclick="Control.Modal.close();" value="Cancel" /> </div> </form> </div> </div>@H_301_13@我还要提一下,我正在寻找一个完全基于selenium的解决方案 – 我知道AutoIt和类似的工具,但我需要远程运行它.
解决方法
wd.find_element_by_css_selector('a[onclick*="uploadDocument"]').click() wd.find_element_by_css_selector('div#UploadDocumentPopup input#documentfile').send_keys(os.getcwd()+"/<filename>") wd.find_element_by_css_selector('div#UploadDocumentPopup input[value="Upload"]').click()@H_301_13@你应该在哪里替换< filename>使用您尝试上传的文件的确切名称.这个版本使用os.getcwd()来获取testscript的当前工作目录,然后将文件名附加到该工作目录的末尾,创建一个可在任何机器上工作的通用路径,而不是指定一个将中断的绝对路径下一台机器.使用此代码不再需要Javascript代码段.
我使用CSS选择器,因为我更喜欢它们而不是xpaths,如果你愿意,你应该能够轻松地转换它们. (如果你真的不能,请发表评论,我会去吧)
JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测
我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量https://stackoverflow.com/a/41904453/648236来检测selenium驱动的浏览器。
我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试修改后重新尝试编译selenium源,但是似乎无法在存储库中的任何地方找到NavigatorAutomationInformation源https://github.com/SeleniumHQ/selenium
任何帮助深表感谢
PS:我还从https://w3c.github.io/webdriver/#interface尝试了以下操作
Object.defineProperty(navigator, ''webdriver'', { get: () => false, });
但是它仅在初始页面加载后更新属性。我认为网站会在执行脚本之前检测到变量。
答案1
小编典典从当前的实现开始,一种理想的访问网页而不被检测到的方法是使用ChromeOptions()该类向以下参数添加几个参数:
排除enable-automation
开关的集合
关掉 useAutomationExtension
通过以下实例ChromeOptions
:
Java示例:
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");ChromeOptions options = new ChromeOptions();options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));options.setExperimentalOption("useAutomationExtension", false);WebDriver driver = new ChromeDriver(options);driver.get("https://www.google.com/");
Python范例
from selenium import webdriveroptions = webdriver.ChromeOptions()options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option(''useAutomationExtension'', False)driver = webdriver.Chrome(options=options, executable_path=r''C:\path\to\chromedriver.exe'')driver.get("https://www.google.com/")
node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?
我们已经使用selenium-webdriver了解java,但是当我们开始使用新框架时,我们只想打开简单,快速和可靠的选项.
请建议javascript与webdriverjs(我们需要学习javascript)或java与selenium-webdriver?
解决方法
Java堆栈上有很多selenium工程师,但在Node.js和selenium-webdriver堆栈上并不多.
大多数较新的现代测试框架都是在Node.js中完成的,因为前端和后端都是使用NodeJS完成的,并将继续这种趋势.我要问的问题是开发团队是使用Java(例如Tomcat)还是使用Node.js来开发他们的产品.如果他们使用的是Node.js,那么将测试框架用同一种语言编写也是理想的.
这是为了方便
>开发和自动化团队,定位器等之间的协作.
>减轻开发人员编写硒测试的摩擦
marcel Erz在我们的South Bay Selenium聚会上对此进行了非常好的介绍.我强烈建议您在做出决定之前先仔细阅读.
Java与JavaScript(用于UI测试)
>前端工程师编写的大多数测试
>不熟悉Java及其生态系统
>上下文切换
>不太可能接受测试
http://www.marcelerz.com/blog/talk-nodejs-based-selenium-testing-south-bay-selenium-meetup
现在,如果您开始使用Javascript,那么主要的挑战当然是异步.大多数自动化工程师习惯于使用Python和Java同步模式.需要一些时间来习惯javascript的异步行为.但最终结果是值得的.
我们的框架主要用Node.js编写,我们使用Mocha作为我们的线束和测试运行器.推荐的断言库是Chai,但如果您需要特殊需求,可以使用其他库.
我们选择的selenium库是nd上的WebDriverJs(区分大小写)又名selenium-webdriver,它是官方的JavaScript端口.我们使用selenium-webdriver的主要原因之一是代码可读性以及实现类似同步语法的能力,以便让Java测试工程师牢记.这可以通过利用内置的Promise Manager控制流和Mocha Test Wrapper来实现,它可以自动处理对promise管理器的所有调用,使代码非常同步.
https://code.google.com/p/selenium/wiki/WebDriverJs#Writing_Tests
然后,这是一个添加自己的框架和构建页面对象的问题. Javascript中的页面对象是一个全新的野兽,您必须很好地掌握原型以及如何模拟Java的继承.
您还应该在npm中使用selenium-standalone作为本地和远程执行的唯一通信点,而不是在测试中创建驱动程序实例(本地/远程).这样,框架具有相同的接口并使事情保持一致.您不希望跟踪多个本地驱动程序可执行文件并更新它们.一个包装可以处理所有事情.
如果您已经阅读过这里,并且您非常确定您将使用Node.js路由而不是Java.下面是我们框架的一个非常简化的版本,可以帮助您入门.它具有上面描述的所有实现.欢迎任何拉动请求!
https://github.com/mekdev/mocha-selenium-pageobject
我们今天的关于无法使用带有Java的Selenium WebDriver打开IE11驱动程序实例和无法使用javac的分享就到这里,谢谢您的阅读,如果想了解更多关于IE上的Java中无法使用Selenium WebDriver获取新的窗口句柄、javascript – 无法使用Selenium Webdriver中的send_keys上传文件、JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测、node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?的相关信息,可以在本站进行搜索。
本文标签: