GVKun编程网logo

Selenium WebDriver:等待带有JavaScript的复杂页面加载(js等待页面加载完成)

8

对于想了解SeleniumWebDriver:等待带有JavaScript的复杂页面加载的读者,本文将是一篇不可错过的文章,我们将详细介绍js等待页面加载完成,并且为您提供关于javascript–S

对于想了解Selenium WebDriver:等待带有JavaScript的复杂页面加载的读者,本文将是一篇不可错过的文章,我们将详细介绍js等待页面加载完成,并且为您提供关于javascript – Selenium WebDriver点击隐藏元素、javascript – 如何使用WebDriverJS捕获Selenium错误、JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测、node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?的有价值信息。

本文目录一览:

Selenium WebDriver:等待带有JavaScript的复杂页面加载(js等待页面加载完成)

Selenium WebDriver:等待带有JavaScript的复杂页面加载(js等待页面加载完成)

我有一个Web应用程序可以使用Selenium进行测试。页面加载时运行着许多JavaScript。
该JavaScript代码编写得不太好,但是我什么也不能更改。因此,使用findElement()method 等待元素出现在DOM 中不是一个选择。
我想在Java中创建一个通用函数来等待页面加载,可能的解决方案是:

  • 运行JavaScript脚本WebDriver并将结果存储document.body.innerHTML在字符串变量中body
  • body变量与的早期版本进行比较body。如果它们相同,则设置递增计数器,notChangedCount否则设置notChangedCount为零。
  • 等待一小段时间(例如50毫秒)。
  • 如果页面有一段时间没有变化(例如500毫秒),notChangedCount >= 10则退出循环,否则循环至第一步。

您认为这是有效的解决方案吗?

答案1

小编典典

如果有人真的知道一个通​​用且始终适用的答案,那么它将 很久以前的 所有地方 得到实施,这将使我们的生活变得如此轻松。

您可以做很多事情,但是其中每一个都有一个问题:

  1. 正如Ashwin Prabhu所说,如果您对脚本非常了解,则可以观察其行为并在windowdocument等上跟踪其一些变量。但是,该解决方案并不适合所有人,只能由您自己使用,并且只能在有限的一组上使用。页面。

  2. 通过观察HTML代码以及一段时间内是否已更改,您的解决方案也不错(同样,有一种方法可以通过来直接获取原始HTML和未经编辑的HTML WebDriver),但是:

    • 实际声明页面需要花费很长时间,并且可能会大大延长测试时间。
    • 您永远不知道正确的间隔是多少。该脚本 可能 正在下载耗时超过500毫秒的大型内容。我们公司内部页面上的几个脚本在IE中需要花费几秒钟的时间。您的计算机可能暂时缺少资源-说防病毒软件可以使您的CPU正常工作,那么即使对于非复杂脚本,500 ms也可能太短。
    • 有些脚本永远不会完成。它们会以一定的延迟(setTimeout())调用自己,并一次又一次地工作,并且有可能在每次运行时更改HTML。认真地说,每个“ Web 2.0”页面都可以做到。甚至堆栈溢出。您可以覆盖最常用的方法,并考虑使用它们的脚本是否完整,但是…您不确定。
    • 如果脚本除了更改HTML之外还执行其他操作,该怎么办?它可以做成千上万的事情,而不仅仅是一些innerHTML乐趣。
    • 有一些工具可以帮助您。即Progress Listener和nsIWebProgressListener等。但是,浏览器对此的支持是可怕的。Firefox开始尝试从FF4开始支持它(仍在不断发展),IE 9已对IE9提供了基本支持。

而且我想我很快会想到另一个有缺陷的解决方案。事实是-
由于永恒的脚本正在执行工作,因此何时说“现在页面已完成”没有确切的答案。选择一个最能为您服务的产品,但要提防它的缺点。

javascript – Selenium WebDriver点击隐藏元素

javascript – Selenium WebDriver点击隐藏元素

嗨,我想知道如何使用Selenium WebDriver点击隐藏元素和/或禁用元素.

我知道用硒1我可以这样做如下:

selenium.click(id="idOfHiddenField");

并且这将工作,但是与硒2(WebDriver),这不是.我不想使用jquery来启用或显示隐藏的字段或JavaScript.这是因为大多数测试都在使用xpath.

或者我只需要留下旧的硒,让你点击隐藏的领域?

解决方法

有一个更简单的方法来解决问题使用JavascriptExecutor.

例如:

document.getElementsByClassName('post-tag')[0].click();

上述JavaScript将点击此页面右上方的“Selenium”标签(旁边的问题),即使它被隐藏(假设).

所有你需要做的是通过JavascriptExecutor接口发出这个JS指令,如下所示:

(JavascriptExecutor(webdriver)).executeScript("document.getElementsByClassName('post-tag')[0].click();");

这将使用JS沙箱和综合点击事件来执行点击操作.虽然它破坏了WebDriver用户活动模拟的目的,但是您可以将其用于您的情况下,在您的情况下很好的效果.

javascript – 如何使用WebDriverJS捕获Selenium错误

javascript – 如何使用WebDriverJS捕获Selenium错误

所以我使用的是Selenium的 JavaScript实现,WebDriverJS.与任何Web浏览器自动化一样,最大的障碍是让代码减慢足够长的时间以加载页面元素.我的解决方案是:

对于我想与之交互的每个元素,我都有这样的代码块

xpath = "//div[@id='gs_lc0']/input[@id='gbqfq']"
driver.wait(function(){
    return waitForElement(xPath,driver);
});
try{
    element = driver.findElement(webdriver.By.xpath(xPath));
}catch(e){
    console.log("Wait Function False Positive")
}
element.sendKeys("Let Me Google That For You\n";

用这个函数在wait函数中重复

var waitForElement = function(path,driver){
    console.log("try: " + path)
    try{
        driver.findElement(webdriver.By.xpath(path));
    }catch (e){
        console.log("FAILURE")
        return false;
    }
    console.log("SUCCESS")
    return true;
}

现在这个代码有时会起作用,但是它不会起作用.我觉得等待功能完全不起作用,我只是获得了幸运的网页加载时间.因此,为了测试这个理论,我将try函数添加到代码块中,甚至无法捕获“NoSuchElementError”.所以我的问题首当其冲的是,是否有其他方法来形成tryCatch函数,以便捕获这些错误.

如果想要完整再现,我的代码头部也是如此

var webdriver = require('selenium-webdriver'),element

var driver = new webdriver.Builder().
    withCapabilities(webdriver.Capabilities.chrome()).
    build();

driver.get('google.com');

解决方法

bagelmaker建议使用findElements并不是坏事.这通常是我想要检查一个元素是否存在而不是混乱异常的情况.

但是,为了完整起见,以下是如何处理元素不存在时生成的错误:

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().
    withCapabilities(webdriver.Capabilities.chrome()).
    build();

driver.get('http://www.google.com');

driver.findElement(webdriver.By.id("fofofo")).then(null,function (err) {
    if (err.name === "NoSuchElementError")
        console.log("Element was missing!");
});

driver.quit();

然后是第二个参数是一个errback,如果findElement失败则调用它.因为selenium-webdriver以promises运行,所以这就是你必须捕获错误的方法.使用try … catch无法正常工作,因为Selenium没有立即开始工作;您要求Selenium对findElement执行的工作将在未来的未确定时间执行.到那时,JavaScript执行将从你的try … catch中移出.

上面的代码搜索id值为fofofo的元素,该元素不存在且失败.

JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测

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?

node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?

我们的团队正计划开发一个框架来自动化手动测试用例.但我们仍然坚持在 javascript和java之间进行选择.通过一些搜索,我们发现Webdriverjs是javascript的selenium绑定.现在,主要障碍是我们是否应该使用selenium-webdrier来使用webdriverjs或java的javascript?

我们已经使用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

我们今天的关于Selenium WebDriver:等待带有JavaScript的复杂页面加载js等待页面加载完成的分享已经告一段落,感谢您的关注,如果您想了解更多关于javascript – Selenium WebDriver点击隐藏元素、javascript – 如何使用WebDriverJS捕获Selenium错误、JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测、node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?的相关信息,请在本站查询。

本文标签: