当前位置: 首页 > 知识库问答 >
问题:

如何单击“下一步”按钮直到它不再存在-Python、Selenium、请求

梁丘翔
2023-03-14

我正在从分页的网页中抓取数据,一旦我抓取完一页,我需要单击下一个按钮并继续抓取下一页。一旦我抓取了所有页面并且下一个按钮不再存在,我就需要停止。下面包含我需要单击的“下一步”按钮周围的html。

<tr align="center"> 
   <td colspan="8" bgcolor="#FFFFFF">
     <br> 
     <span class="paging">
       <b> -- Page 1 of 3 -- </b>
     </span>
     <p>
       <span class="paging"> 
         <a href="page=100155&amp;by=state&amp;state=AL&amp;pagenum=2"> .          
           <b>Next -&gt;</b>
         </a> 
           &nbsp;&nbsp;
       </span> 
       <span class="paging"> 
         <a href=" page=100155&amp;by=state&amp;state=AL&amp;pagenum=3">Last -&gt;&gt;</a> 
       </span>
     </p>
   </td>
</tr>

我尝试过在类和链接文本上选择,但在我目前的尝试中,这两种方式都不适合我。

我的代码的2个例子:

while True:
    try:
        link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next ->"))).click()
    except TimeoutException:
        break

while True:
        try:
            link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "paging"))).click()
        except TimeoutException:
            break

我在网上找到的所有解决方案都不起作用,并且主要以以下错误结束:

ElementClickInterceptedException: Message: element click 
intercepted: Element <a href="? 
page=100155&amp;by=state&amp;state=AL&amp;pagenum=2">...</a> is not 
clickable at point (119, 840). Other element would receive the 
click: <body class="custom-background hfeed" style="position: 
relative; min-height: 100%; top: 0px;">...</body>
(Session info: chrome=76.0.3809.132)

如果错误代码的其余部分对审查有帮助,请告诉我,我会用这个错误更新帖子。

我查看了以下资源,但都无济于事:

Python Selenium点击下一步按钮直到结束

python-如何在Selenium中单击“next”直到它不再可用?

蟒蛇硒点击下一步按钮

Python Selenium点击下一步按钮直到结束

Selenium以编程方式单击“下一步”按钮,直到最后一页

如何让Selenium点击“下一步”按钮,直到不再可能?

谁能给我一些建议,告诉我如何选择“下一步”按钮(如果有的话)并使用这组HTML进入下一页?请让我知道,如果你需要任何进一步的请求澄清。

共有1个答案

有耀
2023-03-14

听起来你在这里问了两个不同的问题:

  1. 如何单击下一步按钮直到它不再存在
  2. 如何使用Javascript单击下一步按钮。

下面是#2的解决方案--Javascript点击:

        public static void ExecuteJavaScriptClickButton(this IWebDriver driver, IWebElement element)  
        {
            ((IJavaScriptExecutor) driver).ExecuteScript("arguments[0].click();", element);
        }

在上面的代码中,您必须将您的WebDriver实例转换为IJavascriptExector,这允许您通过Selenium运行JS代码。参数元素是您希望单击的元素——在本例中为Next按钮。

根据您的代码示例,您的Javascript单击可能如下所示:

var nextButton = driver.findElement(By.LINK_TEXT, "Next ->"));
driver.ExecuteJavascriptClickButton(nextButton);

现在,转到你的另一个问题——点击直到按钮不再可见。我将在一个< code>while循环中实现这一点,每当Next按钮不再存在时,该循环就会中断。我还建议实现一个可以检查下一个按钮是否存在的函数,并在按钮不存在的情况下忽略< code>ElementNotFound或< code>NoSuchElement异常,以避免破坏您的测试。下面是一个包含< code>ElementExists实现的示例:


public bool ElementExists(this IWebDriver driver, By by)
{
    // attempt to find the element -- return true if we find it
    try 
    {
        return driver.findElements(by).Count > 0;
    }

    // catch exception where we did not find the element -- return false
    catch (Exception e)
    {
        return false;
    }
}

public void ClickNextUntilInvisible()
{
    while (driver.ElementExists(By.LINK_TEXT, "Next ->"))
    {

        // find next button inside while loop so it does not go stale
        var nextButton = driver.findElement(By.LINK_TEXT, "Next ->"));

        // click next button using javascript
        driver.ExecuteJavascriptClickButton(nextButton);
    }
}

这个while循环在每次迭代时检查Next按钮的存在。如果按钮不存在,循环就会中断。在循环中,我们每次连续单击都会调用driver.findElement,这样我们就不会得到StaleElementReessceException

希望这能有所帮助。

 类似资料:
  • 我有一个包含36个按钮的响应网站。乍一看,我们只能看到12个按钮,我需要验证它们的文本值,我知道如何做到这一点。但问题是我需要点击下一步按钮,直到它不可见。那么在c#中如何用selenium来做呢? 此外,在单击“下一步”时,我们需要将按钮的文本存储在一个列表或数组中,这样我就可以将所有列表添加到一个新列表中并进行比较。 看看下面的代码,我试过了。 现在上面的工作正常,但当“下一步”按钮不可用时,

  • 我想写一个代码,让Python在页面上抓取一些数据,然后单击页面底部的“下一步”按钮,在第二页上抓取一些数据,单击“下一步”按钮等,直到最后一页,在那里不再可能单击“下一步”(因为没有“下一步”)。 我想尽可能使代码通用,而不是事先指定要做的点击次数。根据这个问题(我如何让Selenium点击可变数量的“下一步”按钮?),我有下面的代码。Python不会报告任何错误,但是程序会在第一次迭代之后停止

  • 这是我第一个问题的后续问题,我正在尝试抓取一个网站,让Selenium点击(直到无法点击为止)并收集结果。 这是来自网站的html标签,带有按钮: 我试过这个代码: 我也查过这个问题,但还是没能解决。 有什么想法吗?

  • 在我的程序中,它将单击浏览器中的一个按钮,并且在该页面中,应该会出现另一个按钮。出现该按钮后,我的程序将立即运行下一个操作来单击下一个按钮。我目前收到此错误: ElementNotVisibleException:消息:元素不可见 因此,我假设我正在调用该操作,以便在该按钮出现之前单击下一个按钮。我的问题是,我该怎么做才能让我的程序等到我可以点击按钮,再点击按钮? 这就是我的程序底部的代码的样子。

  • 嗨,我是一个网络抓取新手,一直在尝试使用Selenium用python抓取论坛 我想让Selenium点击"下一步",直到最后一页,但我不知道如何打破循环。 当我通过部分链接找到下一个按钮时,自动单击将继续到下一个线程,例如page1- 当我按类名找到下一个按钮时,自动单击将在到达最后一页时单击“prev”按钮 我的问题是: 我应该使用哪个定位器?(按类还是按部分链接或任何其他建议? 如何打破循环

  • 我正试图让JQuery在按下下一个按钮时自动单击该按钮。在互联网上,我发现应该是这样的(查看JQuery部分)。但由于某种原因,它不起作用。 它们必须在同一个代码中吗? 我尝试过的:JQuery: 表单中的按钮1 HTML: 表单中的按钮2 HTML: