Python Selenium Code根据调用模式的不同表现

时间:2017-03-23 16:56:05

标签: python selenium selenium-webdriver phantomjs

我绊倒了很容易重现的代码,让我发疯了。

我尝试使用Python和PhantomJS webdriver(selenium)在网站表单中输入容器代码拍摄屏幕。< / p>

使它成为可能的代码很短,并在控制台中重现它可以正常工作。但是如果相同的代码在函数或脚本中,它的行为也不一样。

这是工作代码,这对我来说可以在控制台中逐行编写: (Python版本2.7.9,selenium 2.53.6)

> python

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1280, 1024)
driver.get('http://www.track-trace.com/container')
driver.find_element_by_name('number').clear()
driver.find_element_by_name('number').send_keys('CGMU5109933')
driver.find_element_by_xpath('//input[@name="commit" and @value="Track direct"]').click()
driver.save_screenshot('./x.png')

但是,函数或脚本中的相同代码只有在到达单击时才会表现相同。 加载时冻结,屏幕截图显示了这一点。 无论我尝试什么类型的等待,隐式或显式,加载按钮都不会结束。

这是foo.py模块中函数内部的相同代码,以便更轻松地尝试。

拍摄的照片与上述代码拍摄的照片不匹配。

# foo.py
from selenium import webdriver
def try_it():
    driver = webdriver.PhantomJS()
    driver.set_window_size(1280, 1024)
    driver.get('http://www.track-trace.com/container')
    driver.find_element_by_name('number').clear()
    driver.find_element_by_name('number').send_keys('CGMU5109933')
    driver.find_element_by_xpath('//input[@name="commit" and @value="Track direct"]').click()
    driver.save_screenshot('./x.png')

> python
>>> import foo
>>> foo.try_it()

代码必须在函数中,因为当新的搜索请求到达集成在应用程序中的Web服务时,它会按需调用。

我总是首先寻找可能有效答案的问题,但这次它似乎与我的问题没什么相似。

任何想法为什么会发生这种情况以及如何避免它将非常感激。如果需要任何其他代码或澄清,请不要犹豫。

1 个答案:

答案 0 :(得分:1)

这纯粹是一个时间问题。按钮单击不会阻止,这意味着一旦发出单击,它就会返回,而python会立即运行下一行。您需要等到下一页完成加载后才能截取屏幕截图。我会使用一个明确的等待,直到您感兴趣的下一页上的元素已加载。同样,我认为你需要担心弹出窗口询问你是否真的想直接使用。

我的剧本:

from explicit import waiter
from selenium import webdriver
from selenium.webdriver.common.by import By


def locate_container(driver, container_id):
    url = 'http://www.track-trace.com/container'
    track_direct_xpath = '//input[@name="commit" and @value="Track direct"]'
    im_sure_css = 'div.modal-footer button.jq-directinfo-continue'
    tracking_details_header_css = 'div#wrapper > div.inner > h1'

    # Load the container search page
    driver.get(url)

    # Locate the container field, enter container_id, click direct search button
    waiter.find_write(driver, 'number', container_id, clear_first=True, by=By.NAME)
    waiter.find_element(driver, track_direct_xpath, By.XPATH).click()

    # Locate I'm Sure button and click it
    waiter.find_element(driver, im_sure_css, By.CSS_SELECTOR).click()

    # Wait for the "Tracking details for Container: XXX" header to load
    waiter.find_element(driver, tracking_details_header_css, By.CSS_SELECTOR)

    # Now we know the page has loaded and we can take the screenshot:
    driver.save_screenshot('./x.png')

def main():
    driver = webdriver.PhantomJS()
    try:
        driver.set_window_size(1280, 1024)
        locate_container(driver, 'CGMU5109933')
    finally:
        driver.quit()


if __name__ == "__main__":
    main()

(完全披露:我维护显式包,这意味着简化使用显式等待。您可以用直接等待替换它并获得相同的效果。只需pip install explicit安装)