点击按钮与python / selenium / phantomjs

时间:2018-04-23 13:54:28

标签: python selenium xpath css-selectors phantomjs

我试图使用 python 3.5 / selenium / phantomjs 的组合来抓取this

有一个按钮可以加载更多优惠

<button data-behavior="result-paging" class="button button-text--centered">
    Mehr laden
</button>

这个确切的按钮在HTML代码中是两次,如果列出所有商品,第一个按钮看起来如下,而第二个按钮保持不变:

<button data-behavior="result-paging" class="button button-text--centered is-hidden">
   Mehr laden
</button>

点击我尝试过的第一个按钮:

    while True:
        try:
            time.sleep(4)
            btnElements = driver.find_elements_by_xpath("//button[@data-behavior='result-paging']")
            for btnElement in btnElements:
                btnElement.click()
                # btnElement.send_keys("\n")
                if i==11:
                    break
                else:
                    i=i+1
        except:
            break

    while True:
        try:
            time.sleep(4)
            elements= driver.find_elements_by_xpath("//button[@data-behavior='result-paging']")
            driver.execute_script("arguments[0].click();", elements[0])
            if i==11:
                break
            else:
                i=i+1
        except:
            break

循环只是用于快速测试目的,因为脚本将永远运行。使用booth方法没有加载新内容,因此点击无效。

有没有人知道如何解决这个问题(执行点击并加载其他优惠)?

修改

显然这个问题是由phantomjs引起的,因为我可以用chromedriver运行相同的脚本。不幸的是我需要运行phantomjs。有没有人以前经历过这种行为?

1 个答案:

答案 0 :(得分:1)

根据您的代码阻止您使用的定位器策略 ...

find_elements_by_xpath("//button[@data-behavior='result-paging']")

...未标识可见按钮,文字为 Mehr laden 唯一。

解决方案

要识别文本为 Mehr laden 的可见按钮,您可以使用以下定位器策略的eith:

  • CSS_SELECTOR

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    # lines of code
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-psa-scope=tarifflist] button.button.button-text--centered"))).click()
    
  • XPATH

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    # lines of code
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@data-psa-scope='tarifflist']//button[@class='button button-text--centered']"))).click()