Change textarea inside webbrowser - vb.net

I'm trying for hours to change a text area inside a webbrowser in VB.net. I was not able to do it... This is the code from that textarea :
<textarea name="message_html" class="textCtrl MessageEditor BbCodeWysiwygEditor " id="ctrl_message_html" style="height: 260px; display: none;" data-options='{"autoSaveFrequency":"60","bbCodes":[]}' data-auto-save-url="forums/Snapchat-Girls/save-draft" data-dialog-url="index.php?editor/dialog&style=1" data-css-url="css.php?style=1&css=editor_contents&d=1447310869"><p>This is where the text will be</p></textarea>
Note : Loog for "This is where the text will be" inside the code.
Codes i tried :
For Each element As HtmlElement In Me.WebBrowser1.Document.All
If element.OuterHtml.Contains("textCtrl MessageEditor") Then
element.SetAttribute("value", "TEST")
End If
Next
WebBrowser1.Document.GetElementById("ctrl_message_html").SetAttribute("value","TEST")
For Each element As HtmlElement In Me.WebBrowser1.Document.All
element.SetAttribute("value", "TEST")
Next
None of these worked...
PS : Is not my website. So don't ask me to add ids or something.

I am sure this is not needed anymore, but for reference to those who might still be looking for an answer to this question....maybe this might help your needs
Dim Wctl as string = WebBrowser1.DocumentText.Replace("[searchvalue1]", "test1").Replace("[searchvalue2]", "test2")
Then
WebBrowser1.DocumentText = "0"
WebBrowser1.Document.OpenNew(True)
WebBrowser1.Document.Write(Wctl)
WebBrowser1.Refresh()

Related

Get multiline text from textarea with Selenium VBA

I need to get multiline text from textarea element of web-page. I see in Chrome developer tool that text I need is stored in value property of textarea.
I marked it on screenshot
Below is fragment of page source:
<div id="team1">
<div id="lineupsPanel1" style="display: block;">
<textarea id="lineupsField1" placeholder="Enter text for analyze here"></textarea>
<button onclick="viewLineupsInTable(1,1)" title="Process text" style="cursor: pointer; font-weight: bold; color: red; padding: 3px 6px; margin: 0px 4px
0px 0px;">Process</button>
I try below code to get text from value property
Set WebElemTextBox = Chrome.FindElementById("lineupsField1")
If Not (WebElemTextBox Is Nothing) Then
TextVar = WebElemTextBox.value
End If
But so TextVar gets only first line of stored text (on screenshot example
value: "Next items are not found:↵↵Pam-pam↵↵Next items are found:↵↵Monitor"
But TextVar gets only "Next items are not found:" ).
How to get full multiline text?
I also found some answers to use something like
TextVar = WebElemTextBox.getAttribute("value")
But I get
"Run-time error: 438. Object doesn't support this property or method"
on that string while testing.
UPDATE. I figured out the problem myself:
When you watch value of the variable by moving cursor to it - then for string variable is showing only first line of text without any mark (three dots or something else). We should use Watch Window instead to not to be cheated.
So method TextVar = WebElemTextBox.value works well.
If possible posting the HTML would be helpful, but I'll try answering it anyway.
First Check your element Id for each line you wish to make into a string, I'm assuming they are sequential. Something like "lineupsField1", "lineupsField2", lineupsField3" etc.
If so you can loop through and append these values to a string. Ex:
For i = 1 to 10
Set WebElemTextBox = Chrome.FindElementById("lineupsField" & i)
If Not (WebElemTextBox Is Nothing) Then
TextVar = TextVar & WebElemTextBox.value
End If
Next
If the element Id's are not in sequential order than instead of looping just append till you reach your goal. Ex:
Set WebElemTextBox = Chrome.FindElementById("lineupsField1")
If Not (WebElemTextBox Is Nothing) Then
TextVar = TextVar & WebElemTextBox.value
End If
Set WebElemTextBox = Chrome.FindElementById("Element2")
If Not (WebElemTextBox Is Nothing) Then
TextVar = TextVar & WebElemTextBox.value
End If
As far as the other method you showed:
TextVar = WebElement.getAttribute("value")
I wouldn't recommend going down this path as you are likely going to create more work for yourself parsing through all the values in the HTML.
I figured out the problem myself:
When you watch value of the variable by moving cursor to it - then for string variable is showing only first line of text without any mark (three dots or something else). We should use Watch Window instead to not to be cheated. So method
TextVar = WebElemTextBox.value works well.

Click String That Runs Javascript

I am trying to click a string of text within a web browser control that runs some javascript, I am unsure how to click the text as the method I use for buttons does not work in this instance
Function Clk(WebBrowserID, ElementID)
WebBrowserID.Document.GetElementById(ElementID).InvokeMember("click")
Return "Clicked"
End Function
This is all that is visible to the client in regards to the clickable text
<div class="task-skip pure-g">
<div class="pure-u-1">
Next
</div>
</div>
I am completely lost on how to either click the text so that the javascript script runs or to invoke the script through code so the button does not need to be pressed, any help would be greatly appreciated.
The solution that I found and worked is as below hope this will help anyone else with the issue.
For Each Element As HtmlElement In Browser.Document.All
If Element.InnerText = "TEXT HERE" Then
Element.InvokeMember("click")
End If
Next
Return "RETURN VALUE"

Getting Visual Basic Program to Type into an HTML <p> and <input> tag with no id/name

So I have a program that takes a few inputs from textboxes and then adds them all up into two strings. Basically here is the problem, I am trying to get one of the strings to go into the forum post "title" and one into the forum "body". (This is not a spam program, it makes it easier for people to post ban reports for players on our server.) Here is the HTML codes for the website I am trying to type into;
<p class="ipsField_content">
<input id="topic_title" class="input_text" type="text" size="60" maxlength="150" name="TopicTitle" value="" tabindex="2">
</p>
The HTML code above is for the topic title area I want to type into. The problem with this is that it always says how it can not find this area.
'This is the HTML code for the forum body:
<body spellcheck="true" class="cke_show_borders">
<p>This is where I want to be able to type</p>
</body>`
With the HTML code above, I can't seem to get this VB code below to select that text area and enter in my string.
WebBrowser1.Document.GetElementsByTagName("p").InnerText = post
One reason is because VB doesn't allow me to use .innertext on a tag, and the other is that I do not know how to really specify which "p" tag. Like there is multiple "p" tags on this webpage, but it is the only "p" inside the "body" tag, if I could specify that somehow.
Here is the VB code I am using currently for the program.
Dim Report As String
Report = YourName & Suspect2 & Server & Time2 & Reason & RulesBroken & Proof
Dim topictitle As String
topictitle = ("" & Suspect & " - " & txtReason.Text & txtReasonCustom.Text & "")
txtTitle.Text = topictitle
txtPost.Text = Report`
making sure that the words "sign out" is on the page to insure the webbrowser is signed in.
`Dim theElementCollection As HtmlElementCollection
theElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
For Each curElement As HtmlElement In theElementCollection
Dim controlName As String = curElement.GetAttribute("name").ToString
If WebBrowser1.DocumentText.Contains("Sign Out") Then
WebBrowser1.Navigate("www.ThisLinksToMakeNewPostOnTheWebsite.com")
WebBrowser1.Document.GetElementById("topic_title").InnerText = txtTitle.Text
WebBrowser1.Document.GetElementByTagName("body").firstchild.InnerText = txtPost.Text
End If`
this code below is used to click the submit button
`WebBrowser1.Document.Forms(0).InvokeMember("submit")`
also this is the html code for the "Post New Topic" button
<input type="submit" name="dosubmit" value="Post New Topic" tabindex="50" class="input_submit" accesskey="s">
Anyways that is it. I tried to include as much information and as much lines of code as I could to show that I really am trying.
Please help, I have tried the MSDN links, but I can't seem to apply it to this.
From your code I think you are using the WebBrowser control. There is a much less resource hogging alternative. Since you are really only interested in posting to a form, you don't need the overhead of a browser. You can use the HTTPWebRequest to POST the data/text from your textboxes directly to a URL. An example can be found here:
http://howtostartprogramming.com/vb-net/vb-net-tutorial-51-httpwebrequest-post-method/
It's not the best tutorial in the world but it will get you on your way. You would of course still need to know what data you need to send to the web site.

Visual Basic - Change textarea content

I want to change textarea from omeagle.com -> text cheat
The textarea has this code in HTML :
<textarea class="chatmsg " cols="80" rows="3"></textarea>
In visual basic I program my webbrowser1 to navigate to this page. What do I need to do to change the text inside the textarea?
I've already tried this:
WebBrowser1.Document.All.Item("chatmsg").InnerText = "mycontent"
WebBrowser1.Document.All("chatmsg_area").InnerText = "this works"
WebBrowser1.Document.All("chatmsg_body").InnerText = "this works"
More ....
You can not get an element by class name. You can loop through all of the elements and check for a class name though.
Set NodeList = WebBrowser1.Document.getElementsByTagName("*")
For Each Elem in NodeList
If Elem.GetAttribute("class") = "chatmsg " Then
Elem.InnerText = "mycontent"
End If
Next
Give your textarea an id, then access it by its id.
<textarea id="text1"></textarea>
....
WebBrowser1.Document.All("text1").innerText = "New text"

Clicking HTML button in vb.net

I have to click a HTML button programatically which is on the 3rd page of the website . The button is without id. It has just name type and value . The HTML code of the button is given below
<FORM NAME='form1' METHOD='post' action='/dflogin.php'><INPUT TYPE='hidden' NAME='txtId' value='E712050-15'><INPUT TYPE='hidden' NAME='txtassId' value='1'><INPUT TYPE='hidden' NAME='txtPsw' value='HH29'><INPUT TYPE='hidden' NAME='txtLog' value='0'><h6 align='right'><INPUT TYPE='SUBMIT' NAME='btnSub' value='Next' style='background-color:#009900; color:#fff;'></h6></FORM>
i am using the following code to click it
For Each webpageelement As HtmlElement In allButtons
If webpageelement.GetAttribute("value") = "Next" Then
webpageelement.InvokeMember("click")
End If
Next
But i cant able to click it . I am using the vb.net 2008 platform. Can anyone tell me the solution to click it?
I was having the same problem as you. The InvokeMember looks correct so I can only assume its not picking up the correct html element. Try refering to the element explicitly using the value. The following code worked for me but I have adapted it for you:
For Each webpageelement As HtmlElement In allButtons
If webpageelement.GetAttribute("value").Equals("E712050-15") Then
webpageelement.InvokeMember("click")
Exit For
End If
Next
Good Luck :)