This is my code right now:
//#region
let targetElementSelector = "[class='xi81zsa x1lkfr7t xkjl1po x1mzt3pk xh8yej3 x13faqbe']"
let defaultTimeOut = 10
let action = Click(targetElementSelector)
function ActIfElementReady(elementSelector, action, timeOut) {
let abortController = new AbortController()
let actIfElementReadyAsync = async (elementSelector, action, abortController, abortSignal) => {
return new Promise((resolve, reject) => {
let observer = new MutationObserver((mutationsList, observer) => {
// Look through all mutations that just occured
for(let mutation of mutationsList) {
// If the addedNodes property has one or more nodes
if(mutation.addedNodes.length) {
let element = document.querySelector(elementSelector);
if(element) {
action();
observer.disconnect(); // Stop observing
abortController.abort(); // Cancel the other task
resolve('Element is ready and action has been executed');
}
}
}
});
// Start observing the document with the configured parameters
observer.observe(document.body, { childList: true, subtree: true });
// Listen for the 'abort' event on the signal
abortSignal.addEventListener('abort', () => {
observer.disconnect(); // Stop observing
reject('Task was cancelled');
});
});
}
let waitUntilTimeRunOutAsync = async (timeOut, abortController, abortSignal)=>{
DelayTime(timeOut)
abortController.abort()
}
let actIfElementReadyTask = actIfElementReadyAsync(targetElementSelector, action, abortController, abortController.signal)
let waitUntilTimeRunOutTask = waitUntilTimeRunOutAsync(defaultTimeOut, abortController, abortController.signal)
let result
Promise
.allSettled([actIfElementReadyTask, waitUntilTimeRunOutTask])
.then((results) => {
let [actIfElementReadyResult, waitUntilTimeRunOutResult] = results
if (actIfElementReadyResult.status === 'fulfilled') {
// return 'Everything worked as expected:' + actIfElementReadyResult.value
result = true
} else if (actIfElementReadyResult.status === 'rejected' && waitUntilTimeRunOutResult.status === 'fulfilled') {
// return 'The time has run out:'+ actIfElementReadyResult.reason
result = false
}
})
return result
}
ActIfElementReady(targetElementSelector, action, defaultTimeOut)
var paragraph = 'People of cave!!!!'
var imagePath = 'C:\1.png'
function AutoPost(message, imagePath){
let writePostRangeSelector = "[class='xi81zsa x1lkfr7t xkjl1po x1mzt3pk xh8yej3 x13faqbe']"
var addImageButtonSelector = 'img[class="x1b0d499 xl1xv1r"][src="https://static.xx.fbcdn.net/rsrc.php/v3/y7/r/Ivw7nhRtXyo.png"]'
let imageInputSelector = '[role="dialog"] input[type="file"]'
let messageSelector="[class='xzsf02u x1a2a7pz x1n2onr6 x14wi4xw x9f619 x1lliihq x5yr21d xh8yej3 notranslate']"
let postButtonSelector ='[class="x1n2onr6 x1ja2u2z x78zum5 x2lah0s xl56j7k x6s0dn4 xozqiw3 x1q0g3np xi112ho x17zwfj4 x585lrc x1403ito x972fbf xcfux6l x1qhh985 xm0m39n x9f619 xn6708d x1ye3gou xtvsq51 x1r1pt67"]'
if(!(ActIfElementReady(writePostRangeSelector, Click(writePostRangeSelector), 10)))
return "Cannot click the write post section"
if (!ActIfElementReady(imageInputSelector, Click(addImageButtonSelector), 10))
return "Cannot click the add image button"
if (!ActIfElementReady(imageInputSelector, SendKeys(imageInputSelector, imagePath), 10))
return "Cannot send the image to image input"
if (!ActIfElementReady(messageSelector, SendKeys(messageSelector, message), 10))
return "Cannot send message to message section"
DelayTime(7)
if (!Click(postButtonSelector))
return "Cannot click post button"
return "sucessful"
}
AutoPost(paragraph, imagePath)
//#endregion
//Điều hướng trang web
function GotoUrl(url: string) { }//Điều hướng đến url
function Refresh() { }//Load lại trang
function Back(count: number) { }//Quay lại trang trước
function GetUrl(): string { return ''; }//Lấy url hiện tại
function GetPageSource(): string { return ''; }//Lấy source code trang hiện tại
//Tương tác với cookies
function AddCookies(cookie: string, domain: string): boolean { return true; }//Thêm cookie
function GetCookies(domain: string): string { return ''; }//Lấy cookie
function DeleteCookie(name: string): boolean { return true; }//Xóa cookie theo tên
function DeleteAllCookies(): boolean { return true; }//Xóa tất cả cookie
//Tương tác với element
function ExistElement(selector: string, timeout: number): boolean { return true; }//kiểm tra xem element có tồn tại không
function ExistElements(timeout: number, arrSelector: string[]): string { return ''; }//kiểm tra xem các element có tồn tại không
function WaitElementHide(selector: string, timeout: number): boolean { return true; }//Đợi element ẩn đi
function CountElement(selector: string): number { return 0; }//Đếm số lượng element
function RemoveElement(selector: string): boolean { return true; }//Xóa element
function IsElementVisible(selector: string): boolean { return true; }//Kiểm tra xem element có hiển thị không
function IsElementOnScreen(selector: string, timeout: number): boolean { return true; }//Kiểm tra xem element có hiển thị trên màn hình không
function ExecuteJS(script: string): string { return ''; }//Thực thi đoạn code javascript
function GetElementAttr(selector: string, attributeName: string): string { return ''; }//Lấy giá trị thuộc tính của element
function GetElementInnerText(selector: string): string { return ''; }//Lấy innerText của element
function GetElementValue(selector: string): string { return ''; }//Lấy giá trị của element (thẻ input)
function SetElementValue(selector: string, value: string): string { return ''; }//Thay đổi giá trị của element (thẻ input)
function Click(selector: string): boolean { return true; }//Click vào element
function ClickJS(selector: string): boolean { return true; }//Click vào element bằng javascript
function SendKeys(selector: string, content: string): boolean { return true; }//Nhập text vào element
function ClearText(selector: string): boolean { return true; }//Xóa text của element
function SelectText(selector: string): boolean { return true; }//Chọn text của element
function SendEnter(selector: string): boolean { return true; }//Gửi phím enter
function Select(selector: string, value: string): boolean { return true; }//Chọn option của element (thẻ select)
//Scroll
function Scroll(selector: string): boolean { return true; }//Cuộn đến element
function ScrollAndWait(selector: string, timeout: number): boolean { return true; }//Cuộn đến element và đợi
function ScrollAndClick(selector: string): boolean { return true; }//Cuộn đến element và click
function ScrollDistance(distance: number): boolean { return true; }//Cuộn theo khoảng cách
function ScrollIfNotOnScreen(selector: string): boolean { return true; }//Cuộn nếu element không hiển thị trên màn hình
//Tương tác với cửa sổ trình duyệt
function GetSize(): string { return ''; }//Lấy kích thước cửa sổ trình duyệt
function SetSize(width: number, height: number): boolean { return true; }//Thay đổi kích thước cửa sổ trình duyệt
function RetoreSize(): boolean { return true; }//Phục hồi kích thước cửa sổ trình duyệt trước đó
function GetPosition(): string { return ''; }//Lấy vị trí cửa sổ trình duyệt
function SetPosition(x: number, y: number): boolean { return true; }//Thay đổi vị trí cửa sổ trình duyệt
function RetorePosition(): boolean { return true; }//Phục hồi vị trí cửa sổ trình duyệt trước đó
function Screenshot(filePath: string): boolean { return true; }//Chụp ảnh màn hình
//Đợi trình duyệt chuyển qua url mới
function SetUrl() { }
function CheckUrlChanged(timeout: number): boolean { return true; }
//Khác
function DelayTime(seconds: number) { }//Đợi một khoảng thời gian
function DelayRandom(min: number, max: number) { }//Đợi một khoảng thời gian ngẫu nhiên
function Random(max: number): number { return 0; }//Lấy số ngẫu nhiên từ 0 đến max
function RandomInt(min: number, max: number): number { return 0; }//Lấy số ngẫu nhiên từ min đến max
function RandomString(length: number, typeRandom: string): string { return ''; }//Lấy chuỗi ngẫu nhiên
function GetTotp(fa2: string): string { return ''; }//Lấy mã bảo mật từ 2fa
function CheckGetnada(email: string): boolean { return true; }//kiểm tra xem email có phải của getnada không
function GetOtpGetnada(email: string, timeout: number): string { return ''; }//Lấy mã otp từ getnada
function LogJS(content: string) { }//Ghi log javascript
//Một số hàm hỗ trợ Facebook
function SetFbLanguage(language: string) { }//Thay đổi ngôn ngữ facebook
function GetFbWeb(url: string): string { return ''; }//Check web facebook: 1-www, 2-mobile (mfb), 3-mbasic
function SwitchToMfb(url: string) { }//Chuyển sang web facebook dạng mobile
function GetDomainFb(url: string): string { return ''; }//Lấy domain facebook hiện tại
function GetLinkFromId(idOrLink: string, domainFb: string): string { return ''; }//Lấy link từ id (hoặc link)
function GetUid(): string { return ''; }//Lấy uid facebook hiện tại
function CheckFbBlock(): boolean { return true; }//Kiểm tra xem nick facebook có bị block tính năng không
//Nâng cao
function RequestGet(url: string): string { return ''; }//Gửi request get
function RequestPost(url: string, data: string): string { return ''; }//Gửi request post
All my code from ActIfElementReady and AutoPost. The issue is if the everything work as expected, I will make a post in facebook automately, but instead of that only the section that allow user to write post is popup, which mean something wrong. This is a video about the test:
https://www.dropbox.com/scl/fi/yz5fxpsg5noosqs927sss/bug.mp4?rlkey=nsbz6wt7n0jqlzrn34zf1660i&st=wjco2n6u&dl=0
I expect someone be able to tell me what I’m wrong with async/await of js. I come from C#, so it is even better if someone can tell what difference those two things work. Or even better, should I ever touch to async/await of js again or not. Of course, a method that how should my code be fix to run as my expected.
user24693458 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.