How to refer to active browser window and click in something there? - python

I'm quite new in Python, and I'm creating a robot to export some reports from a system that is in Silverlight. Therefore, I can't use elements of the page to click/select/insert dates, etc.
Then, my solution was using pyautogui to move the mouse, click on the right buttons and save the files...
The process is:
-Select dates of the report
-Click on the "team" I need the report for
-Click on preview button (a new window opens here)
-Maximise this window which contains the report
-Click on 'Export' button (drop-down)
-Select 'Export to CSV'
And then, via code, get last downloaded file and move it into the folder where I save the reports.
The bottleneck on this is: sometimes, due to an unknown reason, 'Export' button is 20/'30 pixels aside. It means that the robot clicks in nowhere, and the code stops since there is no "last downloaded file" to handle.
I already noticed this second window (where the report opens) is not in Silverlight. It's simple HTML. I know I could use some methods in selenium to select the Export/Export to CSV option (similarly as I've done to login into this system). But my problem is: how do I refer to this new window?
The code I'm using refers to the main page using selenium.wedriver but I couldn't find a way to refer to the new window (that is closed after I downloaded the CSV. Then I click again in "Preview" and another window opens, and the process repeat hundreds of times)...
wsite='https://WEBSITE TO EXTRACT'
driver = webdriver.Ie('C:\\MyFolder\\IEDriverServer.exe')
driver.get(wsite) #opens the site
driver.find_element_by_id('userNameInput').send_keys('USERNAME')
driver.find_element_by_id ('passwordInput').send_keys('PASSWORD')
driver.find_element_by_id('submitButton').click()
Then, there are a lots of lines of code (where the mouse clicks where it's needed...
pyautogui.moveTo(1846,1000,intervaltoclick)#Preview button
pyautogui.click()
time.sleep(3)
hwnd = win32gui.GetForegroundWindow()
win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
if i<1:
time.sleep(10+t)
else:
time.sleep(5+(t/5))
pyautogui.moveTo(566,52,intervaltoclick)#Export
pyautogui.click()
pyautogui.moveTo(603,205,intervaltoclick)#Save as CSV
pyautogui.click()
time.sleep(3)
pyautogui.moveTo(1270,1025,intervaltoclick)#close window
pyautogui.click()
Would someone have any idea on how can I do that?

You can try to keep the selenium object of IE browser that you used for login. You can keep it hidden if you don't want to show on a screen. You can than try to loop through the IE windows and switch to desired window.
Set<String> allWindowHandles = browser.getWindowHandles();
for(String handle : allWindowHandles)
{
System.out.println("Window handle - > " + handle);
browser.switchTo().window(handle);
System.out.println(browser.getTitle());
}
Here is a helpful link which shows the examples to switch the window.
Selenium WebDriver Switch Window Commands

Related

How can I close automatically or block modal(?) popup?

modal popup and marked blue left below
Is there any way to block modal(? - this is my understing for the box) popup automatically? I'm working on Mac, The bule color marked in left below is saying "do not open one day". I clicked check-box but it shows continuously. My searching result is such popup is called modal/layered popup - I have no idea for such technology. Please help how to block or click automatically by using Pythoin, javascript or Apple script. I'm using Keyboard maestro app so I can put such code before or after opening site which has modal(?) popup. I need to open 8-10 sites so need help.
tried to remove cookies but appear continuously. I think it's better click check-box automatically. Alternative if any is also good if can click "do not open one day" checkbox automatically.

How to get out of a context click in python selenium?

This has been asked before here: How to hide context click? Selenium Chromedriver
But none of the solutions there have worked for me. There is an element on my webpage that requires a right-click to select it (weird, but it makes sense with the site). I am able to click this element using
action.context_click(src).perform()
And I have tried to get rid of the menu that pops up after right-clicking 4 separate ways
# Left-clicking in the same spot after I have right-clicked
action.click().perform()
# Hitting the space bar
webdriver.ActionChains(self.driver).send_keys(Keys.SPACE).perform()
# Hitting the escape key
webdriver.ActionChains(self.driver).send_keys(Keys.ESCAPE).perform()
# Clicking on an unused element
action.move_to_element(WebDriverWait (self.driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "html"))))
action.click().perform()
# Reloading the page did not get rid of it either
self.driver.refresh()
None of these methods have worked to get rid of the menu that pops up. I cannot reload the page to get rid of this otherwise it will deselect the object I am trying to get. This does not affect my program but it is annoying to have it in my way when I am trying to spectate what my program is doing. Any help is appreciated! This is something in my free time so it is not time-sensitive.
I tried to open the context menu (right click) on a random site and then I was able to close it with pyautogui (pip install pyautogui)
action.context_click(src).perform()
import pyautogui
pyautogui.press('esc')
It may be possible that you have to press esc a couple of times.

Python selenium code seems to wait after calling javascript that display modal dialog box

I'm using Python and Selenium to write an automation script in Internet Explorer.
When the web page throws up some kind of modal dialog box, the Python code stops running and just waits for some action to be taken on the popup. After you press the "yes" or "no" button, then the Python code continues.
I believe the underlying Javascript function that is getting called (saveClicked()) is generating the popup box using this line of code:
var result=window.showModalDialog('whatever....')
Does anyone know how to handle this in Selenium? I want my code to click "ok" in this window or to just accept it. I tried right-clicking on the window to look at source code, etc. but those options are not given to me...the only options are "move/close".
I've looked to see if there is some kind of default IE capability in Selenium that will just automatically accept all modal dialog boxes but haven't found any. I also thought of maybe wrapping the call to the Javascript function with something that would somehow send a keystroke to the alert. I'm open to anything!
Here is the code: It never moves past the .execute_script line...it just sits there waiting.
print('Saving')
# I have to do this because I can't get the handle to the save button
# using any of the known Selenium methods but calling the JS works
driver.execute_script('saveClicked();')
print('Test')
driver.switch_to().alert().send_keys(Keys.ENTER)
The code just STOPS after the Javascript is executed and never moves to the print('test') line or any other code I put there.
Any python selenium code suggestions to solve this would be greatly appreciated.
one way: you can try to use Alert to manage popups
Alert(driver).accept()
otherwise you can see the active window or tab with:
#get current window handle
p = driver.current_window_handle
#get windows
chwd = driver.window_handles
driver.switch_to.window(chwd[1])
reference:
https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.alert
Try:
message = "saveClicked()" # or any other of your messages
driver.execute_script(f"alert(\"{message}\");")
driver.switch_to.alert.accept()

python selenium action chain

Need help here about "paste" action in web selenium in linux python3.
the copied content in local test.txt can successfully be paste into web context by using search.send_keys(Keys.CONTROL+ "v").
However, while I try to use actionchains to simulate the mouse "right click" and "paste", it failed. The script hang at "right click" board prompt out without doing anything like expected to in the piucture "arrow down" and "paste" action.
seems I need to find the correct "element" to locate then execute "arrow down" and then "paste".
any idea are much appreciated.
def paste(self):
file = 'test.txt'
f = open(file,'r')
c = clipboard.copy(f.read())
sleep(3)
actions = ActionChains(self.driver)
element = self.driver.find_element_by_xpath("//input[#type='text'][#id='idtboxSensorSearch']")
actions.move_to_element(element).perform()
actions.context_click().perform()
actions.send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.RETURN).perform()
The right-click menu is an Operating System UI element, it is beyond Selenium's control - it simply cannot interact with it. It's the same as if you try to control toolbar buttons or the browser menu - you can't do that with Selenium.
This is what happened with the ActionChains - it sends those events to the web element, not to the right click menu - and you see no interaction.
If you really want to do this - though ctrl-v is enough, it does the same, you should use a desktop applications automation tools. AutoIt, and Java's robot package come to mind as free options.

Get focus on the new window in Selenium Webdriver and Python

Using Selenium Webdriver in Python I am able to click on a button that opens a new browser window, but I have no idea how to change the focus onto the new window. I've searched all over the internet, but found nothing helpful.
The problem is that the window doesn't have a title!
What I need is the focus on the new window, so I can take a screenshot of its contents.
Here is the bit of code around the button that opens the new window:
How to do that...?
You will need to use the .switchTo(windowHandle); command to access your second window.
Before opening the second window - get the windowHandle of the open window:
String mainWindow = driver.getWindowHandle();
Then do your action that opens the second window. Now you'll need to know the handle of the second windowand switch control to it:
Set<string> handles = driver.getWindowHandles();
for (String handle : handles) {
if (!handler.equals(mainWindow)) {
driver.switchTo(handle);
break;
}
}
Your actions for the second window will now happen in that second window. When you're finished and need to interact with the first window again: driver.switchTo().defaultContent();
This worked for me in Python:
another_window = list(set(driver.window_handles) - {driver.current_window_handle})[0]
driver.switch_to.window(another_window);

Categories

Resources