是否有一种方法可以让python-selenium等到页面的所有元素都加载完毕?

时间:2017-12-15 12:44:44

标签: python selenium selenium-webdriver

我要求一般检查是否已加载页面的所有元素。有没有办法检查基本上?

在具体示例中有一个页面,我点击某个按钮,然后我必须等到我点击下一个'按钮。但是,这个' Next'按钮可用,可选择并且可以随时点击。那么如何用selenium检查页面的状态'(?)?

提醒一下:这是一个关于硒的问题,而不是相关网页的质量....

3 个答案:

答案 0 :(得分:0)

可靠地确定页面是否已满载可能具有挑战性。没有办法知道是否所有元素都已加载。你必须定义一些"锚"每个页面中的点,以便您知道,如果已加载这些元素,则可以假设整个页面已加载。通常这涉及测试的组合。例如,您可以定义如果下面的测试组合通过,则认为页面已加载:

  • JavaScript document.readyState === 'complete'
  • "锚"元素
  • 各种"纺纱厂",如果存在,就消失了。

答案 1 :(得分:0)

有一种称为document.readyState的东西可以通过Selenium执行JavaScript脚本来检索。这对动态加载的内容不起作用。它返回以下三种状态之一:

  

<强>载入   文档仍在加载,没有css或其他资源可用

     

<强>互动   文档已加载,没有可用的CSS或其他资源

     

<强>完整   文档和css /其他资源都已加载

您至少在寻找互动。您可以通过调用execute_script

来检索州
driver.execute_script("return document.readyState")

答案 2 :(得分:0)

正如你的问题是如果有一种方法让python-selenium等到页面的所有元素都已加载,答案是

替代方法:

从根本上说,您可以编写一行代码(或通过函数实现)以检查 'document.readyState' == "complete" ,如下所示:

self.driver.execute_script("return document.readyState").equals("complete"))

但是这种做法有一个缺点,即它不能解释 JavaScript / AJAX Calls

为什么不:

默认情况下,通过 Page Loading 编写上述行以等待 Selenium 。所以重写相同的是一个完整的overhead。除非 'document.readyState' 等于 "complete" ,否则客户端(即Web浏览器)永远不会将控件返回给WebDriver实例。一旦满足这个条件,Selenium就会执行下一行代码。

值得一提的是,虽然客户端(即Web浏览器)可以在实现 'document.readyState' equal to "complete" 后将控件返回给WebDriver实例,但它不会占用所有新 HTML DOM 上的Web元素为 present visible {{1} } interactable

因此,根据我们的要求,如果 clickable WebElement interactable 之前 'document.readyState' equal to "complete" > WebDriverWait ,您必须针对个人 expected_conditions 引导 WebElement <强> expected_conditions 即可。以下是一些最常用的 element_to_be_clickable(locator)

  • presence_of_element_located(locator)
  • visibility_of(element)
  • <?php /*take time form file becuse dont wont to use db*/ $my_file = 'file.txt'; $handle = fopen($my_file, 'r+') or die('Cannot open file: '.$my_file); $data = fread($handle,filesize($my_file)); $data =$data.'000'; ?> <!DOCTYPE html> <html lang="en"> <head> <title>website slider</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="./slick/slick.css"> <link rel="stylesheet" type="text/css" href="./slick/slick-theme.css"> <style> img { height: 100vh; width: 100vw; } .imgc{ height: 100vh; width: 100vw; } </style> </head> <body> <!-- silc that i take from upload folder --> <div class="your-class " id="exampleImage" > <?php $images = glob("upload/*.*"); foreach($images as $image) { echo '<div><img class="i" src="./'.$image.'" ></div>'; } ?> </div> <script src="https://code.jquery.com/jquery-2.2.0.min.js" type="text/javascript"></script> <script src="./slick/slick.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $(document).ready(function(){ function sliderInit(){ $('.your-class').not('.slick-initialized').slick({ slidesToShow: 1, infinite: true, slidesToScroll: 1, autoplay: true, pauseOnHover:true, autoplaySpeed: <?php echo trim($data); ?> }); }; /*function for full size*/ function toggleFullscreen(elem) { elem = elem || document.documentElement; if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) { /*$('.your-class').slick('slickPlay');*/ sliderInit(); if (elem.requestFullscreen) { elem.requestFullscreen(); } else if (elem.msRequestFullscreen) { elem.msRequestFullscreen(); } else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen(); } else if (elem.webkitRequestFullscreen) { elem.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); } } else { sliderInit(); /* $('.your-class').slick('slickPlay');*/ if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } } /*call function full size when click on img*/ document.getElementById('exampleImage').addEventListener('click', function() { toggleFullscreen(); }); /*check if there is any change on img myabe add more or delete*/ setInterval(adddata, 20*1000); function adddata(){ $.ajax({ url :"adddata.php", success:function(data){ $('#exampleImage').html(data); setInterval(sliderInit, 1000); $('.your-class').slick('slickPlay'); } }) } }); </script> </body> </html>

以下是'document.readyState' == "complete"

讨论的链接