【问题标题】:How to click "Next" button until it no longer exists - Python, Selenium, Requests如何单击“下一步”按钮直到它不再存在 - Python,Selenium,请求
【发布时间】:2020-01-12 13:30:43
【问题描述】:

我正在从一个分页的网页中抓取数据,一旦我完成了一个页面的抓取,我需要单击下一步按钮并继续抓取下一页。然后,一旦我刮掉了所有页面并且不再存在下一个按钮,我就需要停下来。下面包含我需要单击的“下一步”按钮周围的 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 clicking next button until the end

python - How to click "next" in Selenium until it's no longer available?

Python Selenium Click Next Button

Python Selenium clicking next button until the end

Selenium clicking next button programmatically until the last page

How can I make Selenium click on the "Next" button until it is no longer possible?

谁能提供有关如何选择“下一步”按钮(如果存在)并使用这组 HTML 转到下一页的建议?如果您需要对请求进行进一步说明,请告诉我。

【问题讨论】:

  • 看起来另一个元素正在接收点击而不是 Next 元素。我建议您尝试向下滚动到该元素,然后尝试单击它。
  • 因为它在body标签上,这可能是一个用于拦截点击的弹出窗口。尝试先单击 标记。 (这些通常设置一个标志以允许第二次点击......有时通过更改当前窗口/选项卡的位置并在第二个窗口中打开当前页面来创建一个“弹出窗口”。)发布标记和/或任何客户端脚本。
  • 尝试用javascript点击它。这通常会起作用。
  • 感谢大家的建议。您是否碰巧有可能的代码解决方案可以帮助解决这种情况?我明白你们在说什么,但我对 selenium 比较陌生,并且不完全确定实施您所建议的最佳方式。

标签: python-3.x selenium beautifulsoup python-requests


【解决方案1】:

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

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

这是#2 的解决方案——Javascript 点击:

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

在上面的代码中,您必须将WebDriver 实例转换为IJavascriptExecutor,这样您就可以通过Selenium 运行JS 代码。参数element 是您希望单击的元素——在本例中为“下一步”按钮。

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

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

现在,转到您的另一个问题 - 单击直到按钮不再可见。我将在while 循环中实现这一点,只要 Next 按钮不再存在,该循环就会中断。我还建议实现一个可以检查下一步按钮是否存在的功能,并在按钮不存在的情况下忽略ElementNotFoundNoSuchElement 异常,以避免破坏您的测试。这是一个包含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 循环在每次迭代时检查是否存在“下一步”按钮。如果按钮不存在,则循环中断。在循环内部,我们每次连续点击都会调用driver.findElement,这样我们就不会得到StaleElementReferenceException

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多