我绊倒了很容易重现的代码,让我发疯了。
我尝试使用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服务时,它会按需调用。
我总是首先寻找可能有效答案的问题,但这次它似乎与我的问题没什么相似。
任何想法为什么会发生这种情况以及如何避免它将非常感激。如果需要任何其他代码或澄清,请不要犹豫。
答案 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
安装)