如何单击分页中的箭头元素,这会导致通过WebDriverWait不可见的元素

时间:2018-07-12 10:03:10

标签: python selenium selenium-webdriver xpath webdriverwait

我尝试单击此网页上的下一页链接:https://www.kumon.co.uk/find-a-tutor/ 在您键入伦敦,曼彻斯特或其他任何地方的位置之前,此页面将为空:

源代码如下:

<nav class="visible-xs-block">
             <ul class="pager">

                                        <li>
                        <a data-page="2" href="https://www.kumon.co.uk/find-a-tutor/?centre_search=london&page=2"><small><i class="fa fa-chevron-right"></i></small></a>
                    </li>

            </ul>
        </nav>

我尝试通过两种方式单击下一页:

  • 第一次试用:

    browser.find_elements_by_xpath("//*[@class='fa fa-chevron-right']/../..")[2].click()
    
  • 错误:

    selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
    
  • 第二次审判:

    WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@class='fa fa-chevron-right']/../.."[2]))).click()
    
  • 错误:

    selenium.common.exceptions.WebDriverException: Message: unknown error: Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.
    

重要的是,我找不到与第二条错误消息有关的任何文档,这就是为什么我在stackoverflow上发布第一条消息的原因:)

仅供参考,当我删除click()时,该元素已经很好地定位了,因此这是看起来很烂的click():/

我已经找到了处理Javascript的解决方案,这对我来说可能很酷,但我真的不知道如何实现此=> Selenium Element not visible exception

您怎么看?

你有什么想法可以帮助我吗?不幸的是,我在这个问题上停留了2天:(

编辑:

此代码段:

while browser.find_element_by_xpath("//ul[@class='pagination']//li[last()]/a/small"):
        action = ActionChains(browser)
        search_button = WebDriverWait(browser, 20).until(
                EC.element_to_be_clickable((By.XPATH, "//ul[@class='pagination']//li[last()]/a/small")))
        action.move_to_element(search_button)
        sleep(1)
        search_button.click()

引发错误selenium.common.exceptions.StaleElementReferenceException:消息:stale元素引用:元素未附加到页面文档

我不确定使用try ... except是解决它的最佳解决方案吗?

先谢谢了, 尼古拉斯。

2 个答案:

答案 0 :(得分:1)

要调用 click() 图标上的>移至下一页,您需要为所需的元素引入 WebDriverWait 可以点击,您可以使用以下解决方案:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@class='pagination']//li[last()]/a/small"))).click()

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

答案 1 :(得分:0)

查找使用的xpath不正确。在浏览器控制台中交叉检查xpath很好。上面的答案@DebanjanB中提供的xpath很好。尝试一次:在chrome-> F12->控制台中:将其粘贴到下面并按Enter。

  $x("//ul[@class='pagination']//li[last()]/a/small") 

它必须获取必需的元素。同样,尝试在发布的问题中使用的所有xpath,它们会获取错误的元素,从而导致执行异常。