Copy text from website using Selenium for python - selenium

I'm trying to copy text from a website with the following code and I want it to automatically click the "NEXT" button at the end of the table, without clicking it the code works just fine but when I add the last line to click it gives the error:
"Message: Element is no longer attached to the DOM Stacktrace: at
fxdriver.cache.getElementAt
(resource://fxdriver/modules/web-element-cache.js:9354)
at Utils.getElementAt (file:///c:/users/user/appdata/local/temp/tmpa7dvts/extensions/fxdriver#googlecode.com/components/command-processor.js:8978)
at WebElement.getElementText (file:///c:/users/user/appdata/local/temp/tmpa7dvts/extensions/fxdriver#googlecode.com/components/command-processor.js:11965)
at DelayedCommand.prototype.executeInternal_/h (file:///c:/users/user/appdata/local/temp/tmpa7dvts/extensions/fxdriver#googlecode.com/components/command-processor.js:12534)
at DelayedCommand.prototype.executeInternal_ (file:///c:/users/user/appdata/local/temp/tmpa7dvts/extensions/fxdriver#googlecode.com/components/command-processor.js:12539)
at DelayedCommand.prototype.execute/< (file:///c:/users/user/appdata/local/temp/tmpa7dvts/extensions/fxdriver#googlecode.com/components/command-processor.js:12481)"
The code I'm using is:
driver = webdriver.Firefox()
driver.get("https://it.website.com/Statistics")
wait = ui.WebDriverWait(driver, 10)
wait.until(page_is_loaded)
Next_first = 0
Next_first = driver.find_elements_by_id("next")[0]
data_vector [i]=driver.find_elements_by_class_name("tn")[i].text
Next_first.click()
While the website code is:
<tr>
<td class="tn"> text
</td>
<table class="table class" id="table id">
<thead>...code for table title...
</thead>
<tbody>
<tr>
<td class="tn">data
</td>
</tr>
</tbody>
<dd>
<a class="option clickable" id="next" data-page="1">NEXT</a>
</dd>
</tr>

Is there more than the html-source, like javascript?
Because the input could be detached by javascript, which means you have to wait for it to load properly ( driver.implicitly_wait(#seconds) )
here the link to the discription of "implicit-waits"
The second solution could be that you have to clear the cache/cookies of the webdriver before testing, which is described here

Related

How to find element using xpath when dom changes with window size

The DOM my test application changes depending upon the window size. So I am trying to write an XPATH which will cater for both of these scenarios.
Scenario 1: When the window is maximum size below is the dom:
<tbody>
<tr><td class="sv-table-col-xs"><img src="image.gif">
</td>
<td>03/Mar/2020</td>
<td><span class="sv-label sv-label-primary">You</span>
</td><td>0% of 1</td>
<td>Complete academic review</td>
</tr>
</tbody>
I am using xpath:
//tr[td[contains(text(), '03/Mar/2020')]]//a[text()='Complete academic review']
This works fine and finds the element.
Scenario 2: Below is the DOM when window is shrinked
<tbody>
<tr><td class="sv-table-col-xs">
<b class="tablesaw-cell-label">Status</b>
<span class="tablesaw-cell-content"><img src="../images/emailunr.jpg" style="border:0px" alt="..\images\icons\exploding_email1.gif.gif"></span>
</td>
<td><b class="tablesaw-cell-label">Due Date</b>
<span class="tablesaw-cell-content">03/Mar/2020</span>
</td>
<td><b class="tablesaw-cell-label">Primary Reviewer</b>
<span class="tablesaw-cell-content"><span class="sv-label sv-label-primary">You</span></span>
</td>
<td class="tablesaw-cell-hidden"><b class="tablesaw-cell-label">Other Reviewers</b>
<span class="tablesaw-cell-content">0% of 1</span>
</td>
<td class="tablesaw-cell-hidden"><b class="tablesaw-cell-label">Action</b><span class="tablesaw-cell-content">
Complete academic review
</span></td></tr>
</tbody>
For this the xpath changes to:
//tr/td[5]/span/a
to get to both elements I have tried to use:
//tr/td[5]/span/a | //tr[td[contains(text(), '03/Mar/2020')]]//a[text()='Complete academic review']
this xpath works but I on shrinked window I am not validating the element with text contains ''03/Mar/2020' & 'Complete academic review'.
Not sure if there is a way to validate the texts in both scenarios before selecting the element.
You want to use string value of a node. And function text() doesn't do it.
So instead use . or string() at least for date filtering part.
//tr[td[contains(., '03/Mar/2020')]]//a[text()='Complete academic review']

How to extract the text 8 from the 2nd row and 2nd column as per the html through Selenium and VBA

Using selenium vba i want 2nd row and 2nd column value from webpage table below is the code which i have try but it capture all table.
The output which i want is 8.
driver.FindElementByXPath("//table[contains(#class,'zedoLocTable')]").text
Please find the below html code.
<tr>
<td colspan="4">
<div id="localityTiers">
<br><br>
<table class="zedoLocTable" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<th>TYPE</th>
<th>TIER</th></tr>
<tr>
<td><b>Resedential Sale</b>
</td><td>8</td>
</tr>
<tr><td><b>Resedential Rent</b>
</td><td>5</td>
</tr><tr>
<td><b>Commercial Sale</b>
</td><td>1</td>
</tr><tr>
<td><b>Commercial Lease</b>
</td><td>1</td>
</tr></tbody></table><table></table></div>
</td>
</tr>
Below is the table pic
As per the HTML you have shared to extract the text 8 you can use the following solution:
driver.FindElementByXPath("//table[#class='zedoLocTable']//tr/td/b[contains(.,'Resedential Sale')]//following::td[1]").text
You can use a faster CSS selector, than using xPath, if you are working with later IE or other browers apart from IE
Debug.Print driver.FindElementByCSS(".zedoLocTable td + td").innerText

how to get Table element from a Div that has a Heading tag with a known text - using selenium and java

<h3>Movers and Shakers</h3>
<p>
<strong>Strategy Hint 1:</strong><br>
<strong>Strategy Hint 2:</strong><br>
</p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td> </td>
<td>ExternalId</td>
<td>Name</td>
<td>Price cents</td>
<td>Brand</td>
<tr>
<tr>
<td>1</td>
<td>123</td>
<td>Draw</td>
<td>2</td>
<td>Ciko</td>
<tr>
Now, the know text in the h3 tag is 'Movers and Shakers'. The table and h3 are in a Div tag. Now, how do I get the table for this specific div that has that specific known text('Movers and Shakers').
With the help of xpath, use following code to return the DIV element that contains a heading H3 with the text Movers and Shakers:
WebElement div = driver.findElement(By.xpath("//div[h3[text()='Movers and Shakers']]"));
Ant then, find the table inside this div web-element:
WebElement table = div.findElement(By.xpath(".//table"));
This will return the table element you want:
WebElement table = driver.findElement(By.xpath("//div[h3[contains(.,'Movers and Shakers')]]")).findElement(By.tagName("table"));
this short line worked
WebElement table = driver.findElement(By.xpath("//h3[contains(text(),'Movers and Shakers')]/following-sibling::table"));

Selenium link for image list based on image name or link name

I have a menu ribbon that is constructed from tags, Sub lists are hidden until the upper level list is clicked on. How do I identify the target of this image so that I can click on it?
<li class="rbnsel">
<div class="rbl" href="option/index?lfeCyc=Active">
<img src="../icn/op.png">
</img>
Options
</div>
Selenium IDE doesn't identify the image and link (beyond the higher list item), I have tried:
css=rbl:contains('option')
and
xpath=//span[url()='option/index?lfeCyc=Active']
Suggestions of what I should be using to identify the Target would be appreciated.
Edit:
I have added the javascript that triggers the link to be created.. So my Selenium IDE table source is below..
<tr>
<td>selectWindow</td>
<td>null</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Publish</td>
<td></td>
</tr>
<tr>
<td>runScript</td>
<td>var path = $(this).attr('href'); if (e.which == 1 && !e.ctrlKey) {window.location = getCsBaseUrl() + "/" + path;} else {csNewWindow(path);</td>
<td></td>
</tr>
<tr>
<td>MouseOver</td>
<td>//div[contains(#class, 'rbl') and text()='Options']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//div[contains(#class, 'rbl') and text()='Options']</td>
<td></td>
</tr>
I guess perhaps my sequence or code is wrong, I have tried all possible combinations but no luck.
WebElement we = driver.findElement(By.cssSelector("div.rbl img"));
Then you could do
string attr = we.getAttribute("src");
Hope that helps
I have fudged a solution - but just using the open command for the links in question. It is not a standard mouseover, mousedown set of actions however it will do for now ;-)
ie command 'open' and Target:
/option/index

XPath expression for disabled input in IE7. Testing with Selenium

My problem is very simple. I'm writing a Selenium test that MUST work with IE7. I have a HTML table with couple of rows and 3 columns:
Column 1 - contains a check box
Column 2 - contains a link
Column 3 - contains some free text
One (and ONLY one) of the checkboxes in the table is disabled. My task is to locate and click the link next to the disabled checkbox (on the row of the disabled checkbox). In FireFox this simple XPath expressions work fine:
//tr/td/input[#disabled]/../../td[2]/a
//tr/td/input[#disabled='disabled']/../../td[2]/a
But in IE7 the first expression clicks the top row no matter if the checkbox is enabled or disabled and the second one does not work.
Since the HTML document is very long I'm putting the important part below (as shown in FF):
<tr>
<td class="table_detail w e s center">
<input name="Delete_kG0KCgAMniwAAAEsxxgeUH0G" type="checkbox">
</td>
<td class="table_detail e s">
000000
</td>
<td class="table_detail e s">
some text
</td>
</tr>
<tr>
<td class="table_detail w e s center">
<input name="Delete_hooKCgAMi5AAAAEsFnQeUH0G" type="checkbox">
</td>
<td class="table_detail e s">
111111
</td>
<td class="table_detail e s">
</td>
</tr>
<tr>
<td class="table_detail w e s center">
<input disabled="disabled" type="checkbox">
</td>
<td class="table_detail e s">
400086
</td>
<td class="table_detail e s">
</td>
</tr>
The last link should be clicked:
400086
We use the Java Selenium API in JUnit 3 tests. The test is something like:
public void testSomething()
{
...
selenium.click("//tr/td/input[#disabled]/../../td[2]/a");
//wait to load and then test something on the page that is opened.
...
}
This works in FF but not in IE7. In IE7 it clicks the link on the first row as if disabled is ignored. It also evaluates correct in XPather (FF plugin).
I would appreciate your help.
Thanks!
You have shown the HTML in FireFox, but you haven't shown the HTML in IE, is it the same?
Based upon the information provided I would use this locator:
//tr[td/input[#disabled='disabled']]/td/a
This finds a row that has a cell that contains a disabled input element, and then locates the cell that has an achor and pinpoints the anchor.
However as I cannot see the HTML markup in IE I have no idea if this is valid or not
For the record I was able to resolve the problem by using a DOM locator. Unfortunately it looks as ugly as:
dom=function getLinkNextToDisabled()
{
var addressesTable = document.getElementsByName('AddressList')[0].getElementsByTagName('table')[0].getElementsByTagName('table')[0];
var inputs = addressesTable.getElementsByTagName('input');
for (i = 0; i < inputs.length; i++)
{
if (inputs[i].disabled)
{
return inputs[i].parentNode.parentNode.getElementsByTagName('a')[0];
}
}
};
getLinkNextToDisabled();
Unfortunately code like this makes me sad, so I'm still open for any XPath solution that will work in IE7.
Regards!