gpt4 book ai didi

Python Selenium 代码根据调用模式表现不同

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:03 24 4
gpt4 key购买 nike

我被一个非常容易重现的代码绊倒了,这让我抓狂。

在网站表单中输入容器代码后,我尝试使用 Python 和 PhantomJS webdriver (selenium) 拍摄屏幕照片

使它成为可能的代码非常短,在控制台中重现它工作正常。但是,如果相同的代码位于函数或脚本中,则其行为就不一样了。

这是工作代码,我可以在控制台中逐行编写它:(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 服务时,它会按需调用。

我总是先寻找可能有有效答案的问题,但这次它似乎与我的问题没有任何相似之处。

如果知道为什么会发生这种情况以及如何避免这种情况,我们将不胜感激。如果需要任何其他代码或说明,请随时提出。

最佳答案

这纯粹是时间问题。按钮点击不会阻塞,这意味着一旦发出点击,它就会返回并且 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 即可安装)

关于Python Selenium 代码根据调用模式表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com