Skip to content

Commit

Permalink
Fix a duplicate virtual id error
Browse files Browse the repository at this point in the history
  • Loading branch information
noahshinn committed Dec 7, 2023
1 parent ea946d1 commit 2d74814
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 7 deletions.
26 changes: 19 additions & 7 deletions browser/browser.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"errors"
"fmt"
"log"
"strings"
"sync"
"time"

Expand Down Expand Up @@ -148,29 +149,40 @@ func (b *Browser) Navigate(URL string) error {
}
}

func (b *Browser) AddVirtualIDs() string {
func (b *Browser) addVirtualIDs() error {
existingVirtualIDs, err := b.GetAllVisibleVirtualIDs()
if err != nil {
log.Println("error getting existing virtual ids:", err)
return nil
}
// TODO: invoke custom vID generator
const f = `function addDataVidAttribute() {
js := fmt.Sprintf(`function addDataVidAttribute(excludeIDs) {
const reservedIDs = {};
excludeIDs.forEach(id => reservedIDs[id] = true);
const elements = document.querySelectorAll('button, input, a, textarea');
let counter = 0;
elements.forEach(element => {
if (element.offsetParent !== null) {
if (element.offsetParent !== null && !element.hasAttribute('data-vid')) {
while (reservedIDs["vid-" + counter.toString()]) {
counter++;
}
element.setAttribute('data-vid', "vid-" + counter.toString());
counter++;
console.log(counter);
}
});
}
addDataVidAttribute();`
return f
addDataVidAttribute(%s);`, "["+strings.Join(slicesx.Map(existingVirtualIDs, func(virtualID string, _ int) string {
return fmt.Sprintf(`"%s"`, virtualID)
}), ", ")+"]")
return b.run(chromedp.Evaluate(js, nil))
}

func (b *Browser) Render(lang language.Language) (content string, err error) {
if location, err := b.getLocation(); err != nil {
return "", fmt.Errorf("error getting location: %w", err)
} else if translator, ok := b.translators[lang]; !ok {
return "", fmt.Errorf("unsupported language: %s", lang)
} else if err := b.run(chromedp.Evaluate(b.AddVirtualIDs(), nil)); err != nil {
} else if err := b.addVirtualIDs(); err != nil {
return "", err
} else if html, err := b.getHTML(); err != nil {
return "", fmt.Errorf("error getting html for location %s: %w", location, err)
Expand Down
17 changes: 17 additions & 0 deletions browser/primitives.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,20 @@ checkElementTypeForQuerySelector('%s');`, query)
func (b *Browser) CheckElementTypeForVirtualID(virtualID string) (ElementType, error) {
return b.CheckElementTypeForQuerySelector(fmt.Sprintf("[data-vid=\"%s\"]", virtualID))
}

func (b *Browser) GetAllVisibleVirtualIDs() ([]string, error) {
js := `function getAllVisibleVirtualIDs() {
const elements = document.querySelectorAll('[data-vid]');
const dataVids = Array.from(elements).map(element => element.getAttribute('data-vid'));
return dataVids;
}
getAllVisibleVirtualIDs();`
var virtualIDs []string
if err := b.run(chromedp.Evaluate(js, &virtualIDs)); err != nil {
return nil, fmt.Errorf("error getting all visible virtual IDs: %w", err)
} else if virtualIDs == nil {
return nil, fmt.Errorf("error getting all visible virtual IDs: virtual IDs is nil")
} else {
return virtualIDs, nil
}
}

0 comments on commit 2d74814

Please sign in to comment.