Python 如何将selenium浏览器推向前台?

Python 如何将selenium浏览器推向前台?,python,firefox,selenium,xpath,webdriver,Python,Firefox,Selenium,Xpath,Webdriver,如果浏览器窗口位于bg中,则此行不起作用 from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By # available since 2.4.0 from selenium.webdriver.support.ui import WebDriverWait # available since 2.26.0

如果浏览器窗口位于bg中,则此行不起作用

from selenium import webdriver

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# available since 2.4.0
from selenium.webdriver.support.ui import WebDriverWait
# available since 2.26.0
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox()
browser.get(someWebPage)

element = WebDriverWait(browser, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//button[contains(., "Watch")]')))

elements = browser.find_elements_by_xpath('//button[contains(., "Watch")]')
if elements:
    print 'find watch button',elements
    elements[0].click()
这是错误的

  File "myScript.py", line 1469, in getSignedUrl
    EC.element_to_be_clickable((By.XPATH, '//button[contains(., "Watch")]')))
  File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until
    raise TimeoutException(message)
TimeoutException: Message: ''
但如果我把浏览器窗口放在前面,它不会出错。是因为我不应该使用
EC.元素可点击
?我试图忽略错误并继续单击所需的按钮,但它表示如果浏览器窗口位于后台,则找不到该按钮。所以我想我应该做的是,在这条线出现之前,我把浏览器窗口带到前台

我看到一些人在讨论
切换到()
?但是我的浏览器对象没有这个方法。我可以做些什么来独立地将车窗置于系统前部?谢谢

测试系统

python 2.7 windows 7 x64

python 2.6.6 CentOS 6.4

编辑:我试过了

browser.execute_script("window.focus();")

不起作用

编辑2:我查过医生了

class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)[source]

    An Expectation for checking an element is visible and enabled such that you can click it.
这似乎是因为当窗口处于bg或最小化时,元素不“可见”,所以永远不满足此条件? 无论如何,我尝试了另一种情况

class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)[source]

    An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible. locator - used to find the element returns the WebElement once it is located
看来这一个是有效的。以前我尝试过完全消除这种情况,但它不起作用,可能是因为我没有“等待”足够长的时间(睡眠5秒)

edit3:奇怪的是,同样的代码在使用selenium 2.39 python 2.6.6 firefox 28 centos 6.4的计算机上运行良好,即使浏览器窗口最小化。但同样的代码尝试了另外两台机器,但失败了,浏览器窗口必须最大化,按钮必须“可见” A.win7 x64 firefox 28 selenium 2.41 Python 2.7
B.Fedora 20 firefox 28 selenium 2.41 python2.7要回答您最初的问题,您需要使用最大化窗口方法使浏览器重新聚焦并置于前台。 在Python中应该是这样的:

browser.maximize_window()

现在我不做python,但我是如何在Groovy中解决这个问题的:

browser.js."alert()"
webdriver.switchTo().alert().accept()
我调用了javascript
alert
函数,该函数将窗口带到前台,然后我使用
webdriver.switchTo().alert().accept()
解除了警报。希望Python中也有类似的东西


希望这有帮助

开箱即用,selenium不公开驱动程序进程id或浏览器hwnd,但这是可能的。 下面是获取hwnd的逻辑

  • 初始化驱动程序时,获取集线器的url并提取端口号
  • 从端口号中,找到使用此端口进行侦听的进程id,即驱动程序的PID
  • 导航后,从iexplore的所有实例中查找父PID与驱动程序的PID匹配,即浏览器PID
  • 获取浏览器pid的Hwnd 一旦找到浏览器hwnd,您就可以使用win32 api将selenium带到前台
在这里发布完整的代码是不可能的,我的博客上提供了将浏览器放在前面的完整工作解决方案(C#)


这对我来说很有效,可以将浏览器窗口置于前台。我在Python 3上的Selenium 3.6.0上使用chromedriver进行了测试

from selenium import webdriver

driver = webdriver.Chrome()

driver.switch_to.window(driver.current_window_handle)

Java中的相关答案-

已在Python 36中测试并运行

driver1 = webdriver.Chrome()
driver1.get("http://www.python.org")
pyName = driver1.title
pyHandle = driver1.window_handles[0]
driver2 = webdriver.Chrome()
driver2.get("http://www.ruby-lang.org/en")
rubyName = driver2.title
rubyHandle = driver2.window_handles[0]
#driver 2 at this time will be in the foreground
driver1.switch_to.window(pyHandle)
driver1.switch_to_window(driver1.current_window_handle)

编辑:switch_to_window已被弃用,请使用switch_to.window这是一个完整的黑客攻击,但在Windows7中使用IE、selenium远程驱动程序对我有效

driver.get("about:blank")  
driver.minimize_window()  
driver.maximize_window()  
driver.minimize_window()  
driver.maximize_window()  

我发送一个空白页,然后最小化和最大化两次。这似乎导致新创建的IE具有前景焦点

您可以在单击它之前尝试吗?@alecxe但它在第
EC行出错。元素\u to \u be \u clickable
已经(在我单击它之前),元素是无的,我如何在不引用它的情况下移动到它?该页面使用了一些ajax调用,我必须等待按钮出现,但只要它在bg中,无论我等待多长时间,它都不会“出现”到webdriver,实际上它出现在浏览器窗口中,我可以看到它。删除
EC.element\u to\u可点击
检查并尝试
移动到元素()
@alecxe你的意思是这样吗?参见问题编辑。哦,等等,如何访问这个move\u to\u element()方法?它不在浏览器对象中。我在Windows7x64上尝试了这个,firefox窗口在后台最大化,我仍然得到了错误,这很奇怪。这将永远为我带来前景。当你尝试我的建议时,我假设你的代码是这样的?试试:browser.locateElement(x)除了:browser.maximize_window()browser.locateElement(x)另外,出于好奇,你还运行着什么?为什么你不能给你的浏览器100%的前台访问权限(例如,给它一个专用的虚拟机),它的普通用户只有一个屏幕,他们需要一个普通的firefox窗口来完成其他工作。不应使用selenium firefox。而大多数用户都在windows上,如何设置虚拟机?对于'browser.locateElement(x)`,如何首先获取对元素x的引用?通过使用xpath?(但这假设x已经存在,这可能不是因为它是由ajax加载的,但我可以等待足够长的时间让它显示出来)我不明白你所说的用户只有一个屏幕是什么意思。您的公司应该专门为您的测试提供单独的机器,无论是物理的还是虚拟的(使用Virtualbox)。我尝试在macOS上通过Python使用Selenium使用Chrome驱动程序,但对窗口没有任何影响。在C#中,我通过访问
chromeDriver.Manage().window
并调用
Minimize()
然后
最大化()
在一个原始版本中。感觉很粗糙,但比Python3的任何其他方法都好:
驱动程序。切换到.window(driver.current\u window\u handle)
@etayluz谢谢-我已经更新了匹配的答案。看起来旧方法已被弃用。
driver.get("about:blank")  
driver.minimize_window()  
driver.maximize_window()  
driver.minimize_window()  
driver.maximize_window()